2

我已经通过 Cocoapods 将 TSMessage 实现到我的一个项目中。我正在尝试子类化 TSMessage 的类方法来设置默认视图控制器。来自 TSMessage.m:

+ (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 的消息,说该方法没有被子类化。我用谷歌搜索无济于事;我有一种感觉,我只是错过了一些非常明显的东西。我是新手,所以请多多包涵:)

4

4 回答 4

3

看起来您使用的是旧版本的 TSMessage。当我查看github 上的代码时,该方法的源代码已更改。也许它在您拥有的版本中不起作用。

我建议升级到最新版本的代码,然后在您的应用程序启动后立即+[TSMessage setDefaultViewController:]从您的应用程序委托对象中调用该方法:

#import "TSMessage.h"

@implementation MyAppDelegate

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

@end

注意:这假设 self 上有一个“defaultViewController”属性。我将使用 MainWindow.xib 文件创建/分配此属性。

于 2013-08-22T05:25:47.147 回答
1

我认为您需要确保首先调用 [mySubclass sharedInstance] 而不是 [TSMessage sharedInstance] 以将静态变量初始化为您的类的实例(mySubclass),而不是 TSMessage 的实例。这将确保您的 defaultController 方法稍后将被执行。

于 2013-08-28T16:03:14.123 回答
1

我是 TSMessages 的开发人员,刚刚发现了这个问题。很抱歉有问题

+(UIViewController *)defaultViewController

这是旧版本中的错误,已替换为

+ setDefaultViewController(UIViewController *)defaultViewController

感谢@abhi-beckert 指出用于设置默认视图控制器的新 API。

下次,您还可以在 GitHub 上创建问题:https ://github.com/toursprung/TSMessages/issues?state= open 并链接到 Stackoverflow 问题。

于 2013-11-10T11:16:08.540 回答
-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
于 2013-08-23T16:04:07.020 回答