2013-08-19 110 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问题。