Ios 多次使用同一视图控制器

Ios 多次使用同一视图控制器,ios,objective-c,uistoryboardsegue,Ios,Objective C,Uistoryboardsegue,我不熟悉Objective-C,有个问题。搜索了好几次,但我找不到我要找的东西 我正在使用此应用程序的情节提要。在主屏幕上有一些按钮,上面有标签。这些标签应该显示一个数字。当按下按钮时,您将进入一个新的viewController,在那里输入的内容(在“保存”之后)将返回到主屏幕,并用正确的数字更新标签。所有这些对于一个按钮来说都非常有效,我对此感到非常高兴 问题是: 1。由于我有多个带标签的按钮,我想使用同一个viewController反复输入。我尝试将每个按钮连接到标识符“AddData”

我不熟悉Objective-C,有个问题。搜索了好几次,但我找不到我要找的东西

我正在使用此应用程序的情节提要。在主屏幕上有一些按钮,上面有标签。这些标签应该显示一个数字。当按下按钮时,您将进入一个新的viewController,在那里输入的内容(在“保存”之后)将返回到主屏幕,并用正确的数字更新标签。所有这些对于一个按钮来说都非常有效,我对此感到非常高兴

问题是:

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

2.目前,我使用以下代码将数据带回主屏幕:

HomeScreenView控制器

- (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];
        }

    }
}

这对于一个按钮非常有效,但是如何将其用于多个按钮呢?我听说学员多次使用同一个viewController并将数据返回到不同的位置,但我就是不明白。有什么帮助吗?

您不需要代表

您需要的是视图控制器上的一个属性,该属性处理对它的输入,并知道它为哪个按钮处理输入

切换到输入控制器时,根据按下的按钮设置此属性。回退时,获取此属性以了解要修改的标签

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

@property (nonatomic,assign) NSInteger handlingTag;
或者别的什么,随便你叫什么名字都行

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

使用
sender
参数确定按下了哪个按钮,并在此基础上,根据按钮设置input view控制器的新
handlingTag
属性,以便您知道在我们松开按钮时如何处理它

现在在展开方法中:

switch (source.handlingTag)
基于源的
handlingTag
属性创建开关结构,并基于此值设置适当的标签



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

您不需要委托

您需要的是视图控制器上的一个属性,该属性处理对它的输入,并知道它为哪个按钮处理输入

切换到输入控制器时,根据按下的按钮设置此属性。回退时,获取此属性以了解要修改的标签

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

@property (nonatomic,assign) NSInteger handlingTag;
或者别的什么,随便你叫什么名字都行

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

使用
sender
参数确定按下了哪个按钮,并在此基础上,根据按钮设置input view控制器的新
handlingTag
属性,以便您知道在我们松开按钮时如何处理它

现在在展开方法中:

switch (source.handlingTag)
基于源的
handlingTag
属性创建开关结构,并基于此值设置适当的标签



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

有几种不同的方法来实现您所需要的。但我认为最常见的是代表。 以下是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
在homeScreenViewController连接代理中的下一步:

@interface homeScreenViewController : UIViewController<inputDataDelegate>
此外,最重要的是,不要忘记将self发送给我们的代表:

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

    }
}

有几种不同的方法来实现您所需要的。但我认为最常见的是代表。 以下是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
在homeScreenViewController连接代理中的下一步:

@interface homeScreenViewController : UIViewController<inputDataDelegate>
此外,最重要的是,不要忘记将self发送给我们的代表:

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

    }
}

也许值得编辑一个NS_枚举来定义每种类型的输入,而不是一个模棱两可的NSInteger。好吧,我现在就在尝试。但是如何让inputDataViewController中的每个按钮滑动?在故事板中,我仍然被卡住了,因为它们只允许一个相同的名称标识符…你可以有多个片段到同一个目标场景,但它们必须有不同的标识符。只需设置一个从每个按钮到目标场景的segue,并适当设置segue标识符。如果在移动到目标视图之前进行任何处理,则可能需要在prepareForSegue中说明不同的标识符。它们都可以具有相同的segue标识符。如果从视图控制器而不是按钮钩住segue,则可以通过编程方式调用segue,并将按下的按钮用作发送方参数。可能值得编辑以提及NS_枚举,以定义每种类型的输入,而不是不明确的NSInteger。好的,我现在正在尝试。但是如何让inputDataViewController中的每个按钮滑动?在故事板中,我仍然被卡住了,因为它们只允许一个相同的名称标识符…你可以有多个片段到同一个目标场景,但它们必须有不同的标识符。只需设置一个从每个按钮到目标场景的segue,并适当设置segue标识符。如果在移动到目标视图c之前进行任何处理,则可能需要在prepareForSegue中说明不同的标识符