2013-08-19 72 views
2

我已經通過Cocoapods實現TSMessage到我的一個項目中。我想要繼承TSMessage的類方法來設置默認的視圖控制器。從TSMessage.m:未調用Objective-c子類方法 - TSMessage?

+ (UIViewController *)defaultViewController 
{ 
    NSLog(@"No view controller was set as parameter and TSMessage was not subclassed. If you want to subclass, implement defaultViewController to set the default viewController."); 
    return nil; 
    // Implement this in subclass 
} 

在我的課,我想繼承這個方法返回我的主視圖控制器。這裏是我的代碼在一個我的主要實現文件的頂部,ViewController.m:

@interface mySubclass : TSMessage 
+(UIViewController *)defaultViewController; 
@end 

@implementation mySubclass 
+(UIViewController *)defaultViewController{ 
    NSLog(@"test"); 
    ViewController *vc = [[ViewController alloc] init]; 
    return vc; 
}//end method 
@end 

我仍然可以登錄由TSMessage說,該方法是不是子類的消息。我搜索了Google無濟於事;我有一種感覺,我錯過了一些超級明顯的東西。我是新來的,所以請耐心等待:)

+2

幾乎可以肯定發生的事情是,任何調用defaultViewController的人都沒有使用你的子類。有人需要爲該方法調用[mySubclass defaultViewController]。(同樣,按照慣例,類名應以首字母開頭)。 – danh

回答

3

它看起來像你正在使用舊版本的TSMessage。當我查看code on github時,該方法的源代碼已更改。也許它不適用於你的版本。

我只要你的應用程序啓動建議升級到代碼的最新版本,然後,從您的應用程序委託對象調用+[TSMessage setDefaultViewController:]方法:

#import "TSMessage.h" 

@implementation MyAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [TSMessage setDefaultViewController:self.defaultViewController]; 
} 

@end 

注:這是假定有一個「 defaultViewController「屬性。我會使用MainWindow.xib文件創建/分配此屬性。

+0

我已經注意到了。當我運行'Pod Update'然後'Pod install'時,它仍會安裝這個版本(我認爲是0.9.3)。但最終我仍然想知道我原來的問題的答案。另外,這是來自我的Podfile處理TSMessage的行。 'pod'TSMessages','〜> 0.9'' – Shredder2794

+0

對原始問題沒有真正的答案。我認爲TSMessages有一個錯誤,它發送一個消息給錯誤的對象。在Objective-C中,「類」實際上只是對象的一個​​實例。你的類是一個對象,而你的類的超類是另一個對象。 TSMessage將defaultViewController消息發送給超類對象,而不是您自己定義的類對象。 –

+0

如果您使用的是最新的穩定版本,則必須可以升級到非穩定版本。或者,您可以將源代碼與github中的主源代碼進行比較,然後複製/粘貼更改。 –

-1

TSMessage不會調用+[mySubClass defaultViewController],它仍然會呼叫+[TSMessage defaultViewController]。儘管你的子類TSMessage和重寫類方法,它不會調用你的新類方法,因爲它只綁定到你的子類。

解決此問題的最簡單方法是在TSMessage上創建一個類別,將重寫的類方法放入實現中,並將頭文件包含在.pch文件中,即使您更新到新版本的TSMessage在未來,它仍將以完全相同的方式工作,無需進行任何更改。

以下代碼將解決您的問題。

@interface TSMessage (RewriteDefaultViewController) 
@end 

@implementation TSMessage (RewriteDefaultViewController) 
+ (UIViewController *)defaultViewController 
{ 
    NSLog(@"test"); 
    ViewController *vc = [[ViewController alloc] init]; 
    return vc; 
} 
@end 
1

我認爲你需要確保[mySubclass sharedInstance]而不是[TSMessage sharedInstance]被稱爲第一個靜態變量初始化類(mySubclass)而不是TSMessage的一個實例的實例。這將確保您的defaultController方法將在稍後執行。

1

我是TSMessages的開發人員,只是發現了這個問題。 很抱歉的問題

+(UIViewController *)defaultViewController 

這是它被替換

+ setDefaultViewController(UIViewController *)defaultViewController 

感謝@ ABHI - 貝克特爲指明瞭新的API用於設置默認視圖控制器在舊版本中的錯誤。

下次,您還可以在GitHub上創建一個問題:https://github.com/toursprung/TSMessages/issues?state=open 並鏈接到Stackoverflow問題。