Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用ARC的自定义代理iOS 6不工作_Objective C_Ios_Xcode_Cocoa_Delegates - Fatal编程技术网

Objective c 使用ARC的自定义代理iOS 6不工作

Objective c 使用ARC的自定义代理iOS 6不工作,objective-c,ios,xcode,cocoa,delegates,Objective C,Ios,Xcode,Cocoa,Delegates,我是一个用Objective-C编程的乞丐。 我在这里和其他网站上搜索了解决我问题的方法,但没有找到。 我想在系统加载之前创建一个登录视图。然后,在登录后,我想取消它。 在我的项目中,我使用ARC,而不使用故事板 当我调试并查看函数“efetuarLogin”时,property delegate的值是0x000000。我想它是空白的,不是吗? 根据我在网上找到的教程和其他提示,这是编写委派代码的正确方法。你能帮我查一下这个吗? 代码如下: Login.h #import <UIKit/U

我是一个用Objective-C编程的乞丐。 我在这里和其他网站上搜索了解决我问题的方法,但没有找到。 我想在系统加载之前创建一个登录视图。然后,在登录后,我想取消它。 在我的项目中,我使用ARC,而不使用故事板

当我调试并查看函数“efetuarLogin”时,property delegate的值是0x000000。我想它是空白的,不是吗? 根据我在网上找到的教程和其他提示,这是编写委派代码的正确方法。你能帮我查一下这个吗? 代码如下:

Login.h

#import <UIKit/UIKit.h>
@class Login;

@protocol LoginDelegate <NSObject>
@required
    - (void)loginDidFinish: (Login *)login;
@end

@interface Login : UIViewController{
    __weak id<LoginDelegate> delegate;
}

@property (nonatomic, weak) id <LoginDelegate> delegate;

- (IBAction)efetuarLogin:(id)sender;

@end
主控制器

#import <UIKit/UIKit.h>
#import "Login.h"

@interface MainController : UITabBarController <LoginDelegate>

@end
并且该方法完成了AppDelegate.m的启动选项:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    mainController = [[MainController alloc] init];

    window.rootViewController = mainController;

    [window makeKeyAndVisible];

    return YES;
}
抱歉,代码太多了。我已经很感激了

我正在使用ViewDidAspect方法向用户显示登录信息。但是当我退出并出现主控制器时,viewdiapper方法会再次创建登录。
如何显示登录一次?当我尝试在viewdidload上执行此操作时,它不起作用。创建
login
对象时,登录名未出现。

MainViewController.m

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    Login *login = [[Login alloc] initWithNibName:@"Login" bundle:nil];
    login.delegate = self;  //add this line
    [login setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    [self presentViewController:login animated:NO completion:nil];
}
编辑:在问题中看到OP的编辑后(应该是另一个线程) 视图控制器层次结构错误。理想的流量应该是

1) 直接从应用程序代理显示登录控制器


2) 成功登录后,从登录控制器中显示MainViewController。

Ok,成功!非常感谢。我认为需要在MainController上声明一个属性来保存登录对象。很高兴它对您有效,stackoverflow中已经讨论了创建委托的概念。当你们有时间的时候,读一读这篇文章,这篇文章内容丰富。如果你觉得这个答案正确/解决了问题,请。顺便说一句,第一个问题,你的结构非常好。再次感谢奎师那婆罗。我总是使用Stackoverflow(仅搜索和阅读),它总能解决我的许多问题!现在我明白了,应该“初始化”委托。顺便说一句,当我取消登录时,它再次出现。由于在viewdidload上实现,但如果在viewdidload上执行此操作,则不会显示登录。登录后,我在委托方法“loginDidFinish”[self dismissViewControllerAnimated:YES completion:nil]上调用此函数;我该如何登录才不会再次出现?卡利曼·博尔赫斯,不要用与原始问题完全不同的问题编辑原始问题。请将其作为其他问题发布,并将其重新编辑为原始形式。您在这里提出的一个问题是针对社区的,因此即使过了很多天,它也应该是可读的。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    mainController = [[MainController alloc] init];

    window.rootViewController = mainController;

    [window makeKeyAndVisible];

    return YES;
}
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    Login *login = [[Login alloc] initWithNibName:@"Login" bundle:nil];
    login.delegate = self;  //add this line
    [login setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    [self presentViewController:login animated:NO completion:nil];
}