多次使用相同的视图控制器

时间:2014-06-01 12:33:54

标签: ios objective-c uistoryboardsegue

我是Objective-C的新手并且有一个问题。多次搜索,但我找不到我想要的东西。

我正在使用这个应用程序的故事板。在主屏幕上,你有一些带有标签的按钮。那些标签应该说明一个数字。按下按钮时,您将转到一个新的viewController,在该视图中您输入(在“保存”之后)返回主屏幕并使用正确的数字更新标签。这一切对一键非常有用,我对此感到非常高兴。

问题是:

1。由于我有多个带标签的按钮,我想使用相同的viewController一遍又一遍地提供输入。我尝试将每个按钮连接到标识符“AddData”下的viewController,但Xcode不允许在storyboard中使用相同的标识符两次或更多次。所以我需要其他的东西。有什么想法吗?

2。目前,我使用以下代码将数据恢复到主屏幕:

homeScreenViewController

- (IBAction)unwindToHomeScreen:(UIStoryboardSegue *)segue;
{
    inputDataViewController *source = [segue sourceViewController];
    self.logoOneLabel.text = source.endTotalNumber;
}

inputDataViewController:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if (sender != self.saveButton) {
        return;
    } else {
        if (endTotalLabelNumber > 0) {
            self.endTotalNumber = [NSString stringWithFormat:@"%.0f", totalLabelNumber + endTotalLabelNumber];
        } else if (endTotalLabelNumber == 0 && totalLabelNumber == 0){
            self.endTotalNumber = 0;
        } else {
            self.endTotalNumber = [NSString stringWithFormat:@"%.0f", totalLabelNumber + endTotalLabelNumber];
        }

    }
}

这适用于一个按钮,但如何使用多个?我听说Delegates多次使用相同的viewController并将数据返回到不同的地方,但我只是不明白。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

你不应该需要代表。

您需要的是视图控制器上的一个属性,它处理输入到它知道它正在处理输入的按钮。

当您转到输入控制器时,根据按下的按钮设置此属性。当您向后展开时,请获取此属性以了解要修改的标签。

例如,在输入视图控制器的.h文件中,添加如下属性:

@property (nonatomic,assign) NSInteger handlingTag;

或者其他什么,无论什么名字对你有意义。

现在您需要实现主屏幕视图控制器prepareForSegue:sender:

使用sender参数确定按下了哪个按钮,并根据该参数,以您将知道的方式设置输入视图控制器的新handlingTag属性我们放松时该怎么办。

现在处于展开方法:

switch (source.handlingTag)

根据源handlingTag属性创建一个开关结构,并根据此值设置相应的标签。


正如杰夫在评论中指出的那样,定义NS_ENUM在这里使用属性而不是NSInteger是一个非常好的主意。 NS_ENUM允许您为您正在使用的值命名。

答案 1 :(得分:1)

有几种不同的方式可以实现您的需求。但我认为最常见的是代表。 这就是你的inputDataViewController的样子:

#import <UIKit/UIKit.h>

@protocol inputDataDelegate;

@interface inputDataViewController : UIViewController

@property (weak) id<inputDataDelegate> delegate;
@property (strong, nonatomic) NSNumber *buttonTag;


@end

@protocol inputDataDelegate <NSObject>

-(void) inputDataViewControllerDismissed:(id)data;

@end

然后在@implementation中,你应该在&#34; save&#34;按钮操作,给您委派方法的消息:

[self inputDataViewControllerDismissed:@{@"buttonTag":buttonTag,@"endTotalNumber":endTotalNumber}

接下来在homeScreenViewController中连接委托:

@interface homeScreenViewController : UIViewController<inputDataDelegate>

之后在@implementation:

-(void)inputDataViewControllerDismissed:(id)data
{
  //  if you use modal
  [self dismissViewControllerAnimated:YES completion:nil];
  // or if you use push     
  //[self.navigationController popViewControllerAnimated:YES];  
  switch (data[@"buttonTag"]) {
        case 1:
            self.lableWtiTagOne = data[@"endTotalNumber"];
            break;
        case 2:
             self.lableWtiTagTwo = data[@"endTotalNumber"];
            break;
    // number of cases depend how many buttons you have
 }

另外,最重要的是,事情并没有忘记向我们的代表发送自己:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"inputDataController"])
    {
        inputDataViewController *inputCtrl  = [segue destinationViewController];
        inputCtrl.delegate                  = self;
        inputCtrl.buttonTag                 = sender.tag

    }
}