Ios 隐藏按钮动作赢了';不能改变问题
我试图在启动应用程序时禁用导航栏按钮,在完成该过程(获取数据)后,我将其重新启用,但不幸的是,它无法启用 请问我的问题在哪里?当我将Ios 隐藏按钮动作赢了';不能改变问题,ios,objective-c,uibutton,Ios,Objective C,Uibutton,我试图在启动应用程序时禁用导航栏按钮,在完成该过程(获取数据)后,我将其重新启用,但不幸的是,它无法启用 请问我的问题在哪里?当我将enable设置为YES时,当我调试它时,我可以看到它将YES设置为enable - (void)viewDidLoad { UIImage *searchBtn = [UIImage imageNamed:@"search_icon.png"]; barButtonSearch = [[UIBarButtonItem alloc] initWit
enable
设置为YES
时,当我调试它时,我可以看到它将YES
设置为enable
- (void)viewDidLoad {
UIImage *searchBtn = [UIImage imageNamed:@"search_icon.png"];
barButtonSearch = [[UIBarButtonItem alloc] initWithImage:[searchBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(searchButton)];
UIImage *menuBtn = [UIImage imageNamed:@"menu_icon.png"];
barButtonMenu = [[UIBarButtonItem alloc] initWithImage:[menuBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(menuButton)];
self.navigationItem.rightBarButtonItem = barButtonMenu;
self.navigationItem.leftBarButtonItem = barButtonSearch;
barButtonMenu.enabled = NO;
barButtonSearch.enabled = NO;
}
- (void)unhide{
if (!(barButtonSearch.enabled && barButtonMenu.enabled)) {
barButtonMenu.enabled = YES;
barButtonSearch.enabled = YES;
}
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
ViewController *theInstance = [[ViewController alloc] init];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
_dic = (NSDictionary *)responseObject;
[theInstance unhide];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Err");
}];
[operation start];
return YES;
}
}
您正在从
AFHTTPOperation
的完成块调用[instance unhide]
——这几乎肯定会在后台队列上执行
所有UI操作都必须在主队列上执行
你应该使用-
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
_dic = (NSDictionary *)responseObject;
dispatch_async(dispatch_get_main_queue(),^{
[theInstance unhide];
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Err");
}];
更新
您的主要问题是,实例
指向视图控制器的一个实例,该实例不在屏幕上-它只是您已分配但未实际显示的实例
假设此视图控制器是应用程序加载的初始视图控制器,您可以使用
[UIApplication sharedApplication].keyWindow.rootViewController
获取对正确实例的引用,您正在调用[instance unhide]
来自AFHTTPOperation的完成块
——这几乎肯定会在后台队列上执行
所有UI操作都必须在主队列上执行
你应该使用-
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
_dic = (NSDictionary *)responseObject;
dispatch_async(dispatch_get_main_queue(),^{
[theInstance unhide];
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Err");
}];
更新
您的主要问题是,实例
指向视图控制器的一个实例,该实例不在屏幕上-它只是您已分配但未实际显示的实例
假设此视图控制器是应用程序加载的初始视图控制器,您可以使用
[UIApplication sharedApplication].keyWindow.rootViewController
获取对正确实例的引用,您正在调用[instance unhide]
来自AFHTTPOperation的完成块
——这几乎肯定会在后台队列上执行
所有UI操作都必须在主队列上执行
你应该使用-
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
_dic = (NSDictionary *)responseObject;
dispatch_async(dispatch_get_main_queue(),^{
[theInstance unhide];
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Err");
}];
更新
您的主要问题是,实例
指向视图控制器的一个实例,该实例不在屏幕上-它只是您已分配但未实际显示的实例
假设此视图控制器是应用程序加载的初始视图控制器,您可以使用
[UIApplication sharedApplication].keyWindow.rootViewController
获取对正确实例的引用,您正在调用[instance unhide]
来自AFHTTPOperation的完成块
——这几乎肯定会在后台队列上执行
所有UI操作都必须在主队列上执行
你应该使用-
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
_dic = (NSDictionary *)responseObject;
dispatch_async(dispatch_get_main_queue(),^{
[theInstance unhide];
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Err");
}];
更新
您的主要问题是,实例
指向视图控制器的一个实例,该实例不在屏幕上-它只是您已分配但未实际显示的实例
假设此视图控制器是应用程序加载的初始视图控制器,则可以使用
[UIApplication sharedApplication].keyWindow.rootViewController
从应用程序委托的完成块中删除此方法,以获取对正确实例的引用
[theInstance unhide];
并添加一些委托函数,该函数将在异步调用完成其任务后激活。并将该取消隐藏方法添加到那里(在您的视图控制器中)。从app delegate的完成块中删除该方法
[theInstance unhide];
并添加一些委托函数,该函数将在异步调用完成其任务后激活。并将该取消隐藏方法添加到那里(在您的视图控制器中)。从app delegate的完成块中删除该方法
[theInstance unhide];
并添加一些委托函数,该函数将在异步调用完成其任务后激活。并将该取消隐藏方法添加到那里(在您的视图控制器中)。从app delegate的完成块中删除该方法
[theInstance unhide];
并添加一些委托函数,该函数将在异步调用完成其任务后激活。并将取消隐藏方法添加到那里(在您的视图控制器中)。好吧,它就在那里
您正在初始化ViewController,但这不会调用viewDidLoad:
方法。推送或显示ViewController时,将调用viewDidLoad:
方法!这是视图加载到内存中的时间
因此,永远不会创建BarButton,并且您无法看到它们
因此,或者在ViewController的viewDidLoad:
方法中进行网络调用
或
推送
ViewController的实例,然后调用方法取消隐藏
编辑
因为您使用的是故事板,而不是从AppDelegate推送任何ViewController,所以需要使用ViewController的引用
在您的-(BOOL)应用程序中替换此选项:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
方法
ViewController *theInstance = (ViewController *)[(UINavigationController*)self.window.rootViewController topViewController];
好了,就在那里
您正在初始化ViewController,但这不会调用viewDidLoad:
方法。推送或显示ViewController时,将调用viewDidLoad:
方法!这是视图加载到内存中的时间
因此,永远不会创建BarButton,并且您无法看到它们
因此,或者在ViewController的viewDidLoad:
方法中进行网络调用
或
推送
ViewController的实例,然后调用方法取消隐藏
编辑
因为您使用的是故事板,而不是从AppDelegate推送任何ViewController,所以需要使用V的引用