我是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并将数据返回到不同的地方,但我只是不明白。有什么帮助吗?
答案 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
}
}