区分进入同一视图控制器的两种方法的最佳方法是什么?

时间:2013-12-26 17:38:56

标签: ios objective-c cocoa-touch

这有点复杂,但这是我需要完成的任务 基本上,我有一个ViewController有两个按钮(登录和上传视频按钮),这两个按钮都转到登录ViewController。但是,当用户点击上传视频按钮然后用户登录时,他们需要被重定向到名为uploadVideoViewController的第三个ViewController。当用户点击登录按钮时,无需在任何地方重定向。有没有办法区分这两个按钮,以便我可以在需要时正确地重定向用户?

的ViewController

-(IBAction)uploadVideo:(id)sender
{
    [self loginViewController];
}

-(IBAction)login:(id)sender
{
    [self loginViewController];
}

LoginViewController

-(void)login 
{
    if (uploadVideobuttonclicked) {
       [self uploadViewController];
    } else {
        //do nothing
    }
}

6 个答案:

答案 0 :(得分:1)

我会为您的视图控制器使用自定义初始值设定项。 如果你能展示loginViewController方法会有所帮助。

但我会做类似

的事情
[self loginViewControllerWithVideo:YES];

然后当第二个视图加载时,您可以检查该bool并只需加载下一个视图。

你甚至可以更进一步,包括视频而不是bool值。

[self loginViewControllerWithVideo:videoToUpload];

将这些放在一起是一个基于您的代码的示例。请注意,我删除了自己。在这种情况下,我不认为自己是必要的。如果您需要初始化程序的示例,请告诉我。

-(IBAction)uploadVideo:(id)sender
{
    [loginViewController loginViewControllerWithVideo:videoToUpload];
}

-(IBAction)login:(id)sender
{
    [loginViewController loginViewControllerWithVideo:nil];
}

答案 1 :(得分:0)

将BOOL参数添加到-(void) login方法,并从两个不同的位置传递TRUE / FALSE。

答案 2 :(得分:0)

我将展示解决问题的替代设计。我在您当前设计中看到的问题是您将上传操作和登录操作过于紧密耦合。如果将来添加另一个也需要登录的按钮怎么办?你最终得到一个巨大的if,更糟糕的是,你的loginViewController知道的太多了:它知道uploadViewController,什么时候不应该。它的唯一责任应该是登录用户,仅此而已。我们可以使用委托来使您的设计更加干净和可扩展。

首先,定义一个简单的委托来传达您的视图控制器:

@protocol LoginDelegate <NSObject>
- (void)didEndLogin;
@end

然后,在主视图控制器中:

-(IBAction)uploadVideo:(id)sender
{
    [self.uploadViewController upload];
}

-(IBAction)login:(id)sender
{
    [self.loginViewController login];
}

然后,在UploadViewController中包含登录逻辑:

@class UploadViewController<LoginDelegate>

- (void)upload
{
    if (user is not logged in) {
        LoginViewController *loginViewController = [LoginViewController alloc] init...];
        loginViewController.delegate = self;
        // You can present this view controller as you like
        [self presentViewController:loginViewController animated:YES completion:nil];
    } else {
        // Upload
    }
}

- (void)didEndLogin
{
    // Upload
}

loginViewController中,声明代理并在登录完成后调用它:

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

- (void)login
{
    ...
    [self.delegate didEndLogin];
}

答案 3 :(得分:0)

只是我,但为什么没有人建议在UIButton中添加标签。那样你知道哪个按钮被按下了...除非我错过了OPs问题。

- (void)viewDidLoad {
   UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
   button.tag = 500;

   [super viewDidLoad];
}

- (IBAction)login:(id)sender {

   if ([sender tag] == 500) {
        // do something
    }
}

答案 4 :(得分:0)

将属性添加到loginViewController @property(nonatomic) BOOL uploadButtonPressedInVC; 现在,当您导航到loginViewController设置该属性时。

-(IBAction)uploadVideo:(id)sender
{    LoginViewController *lVC=[[LoginViewController alloc]init];
     lVC.uploadButtonPressedInVC=YES;
    [self loginViewController];

}

-(IBAction)login:(id)sender
{
     LoginViewController *lVC=[[LoginViewController alloc]init];
     lVC.uploadButtonPressedInVC=YES;
    [self loginViewController];
}

或者您可以在方法定义中创建LoginViewController对象。

答案 5 :(得分:-3)

这可能会对您有所帮助:

的ViewController

-(IBAction)uploadVideo:(id)sender
{
    [[NSUserDefaults standardUserDefaults] setBool:YES forKye:@"Video_To_Upload"];

    [self loginViewController];
}

-(IBAction)login:(id)sender
{
   [[NSUserDefaults standardUserDefaults] setBool:NO forKye:@"Video_To_Upload"];

   [self loginViewController];
}

LoginViewController

-(void)login 
{
    BOOL uploadVideobuttonclicked = [[NSUserDefaults standardUserDefaults]  boolForKey@"Video_To_Upload"];
    if (uploadVideobuttonclicked) {
       [self uploadViewController];
   } else {
      //do nothing
   }
}