3

我正在 iOS 上使用 Azure 移动服务,并且我已启用身份验证。我扩展了微软作为示例提供的默认应用程序以使用 tabBarController。一个控制器是 MS 使用的默认控制器,称为 ToDoListController。

我想在我的第二个控制器 AddItemController 中使用 ToDoListController 中使用的 todoService 属性。所以,在 ToDoListController 的标题中,我有

@property (strong, nonatomic) TodoService *todoService;

在同一个控制器的 m 中,我有它的合成。

当我想在 tabBarController 中使用此属性时,我将其称为

(((TodoListController *)self.parentViewController).todoService)

但我明白了

[UITabBarController todoService]:发送到实例的无法识别的选择器

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarController todoService]: unrecognized selector sent to instance 
4

5 回答 5

4

看起来您正在尝试访问您的标签栏控制器之一。尝试这个

for (UIViewController *v in ((UITabBarController*)self.parentviewController).viewControllers)
{
     UIViewController *vc = v;

     if ([v isKindOfClass:[TodoListController class])
     {
         ((TodoListController *)v).todoservice;
     }
}
于 2013-02-19T20:30:59.613 回答
0

最后问题是一个断点。数据现在很好,没有问题

(((TodoListController *)self.parentViewController).todoService)
于 2013-02-20T09:39:34.913 回答
0

您是否将 ToDoService 的 .h 文件导入到 tabBarController 中?这将允许对 tabBarController 的可见性。为不使用评论功能提前道歉,我不允许。

于 2013-02-19T20:19:38.757 回答
0

我建议让您的 TodoService 成为单身人士。有很多方法可以做到这一点,这里有一段简单的代码,它创建了一个你可以在任何地方访问的单例*。将此方法签名添加到您的 TodoService.h 文件

+ (TodoService *) defaultService;

而这个实现

TodoService *todoService;

+ (TodoService *)defaultService
{
    if (todoService == nil) {
        todoService = [[TodoService alloc] init];
    }
    return todoService;
}

现在,您可以从应用程序中的任何位置访问单个实例

TodoService* service = [TodoService defaultService];
[service doSomething];

*注意,在 Objective C 中实现单例有更好的方法,但在大多数情况下,这是一个很好的方法,你只在主线程上调用 defaultService。

于 2013-02-19T23:05:56.960 回答
0

您将选择器发送到错误的控制器,尝试检测层次结构中的哪一个正是您的 TodoListController。为什么你认为 parentViewController 是 TodoListController?

如果您在 UITabBarController 中呈现为模态当前 VC,则 parentVC 是 UITabBarController。

你也可以试试self.parentViewController.parentViewController

于 2013-02-19T20:45:04.753 回答