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的引用