Objective C - 通过视图控制器传递多个文本字段(或将它们转换为可变数组)以显示为标签
Objective C - Passing multiple text fields (or converting them to a mutable array) through view controllers to display as labels
我是 Objective C 的新手,目前遇到上述问题。我已经学习了教程并尝试在此处找到相关主题,我可以让它为一个变量工作,但是我需要在视图控制器之间传递更多内容。
我试图避免使用全局变量、保存到临时文件和单例(模式)(?)(我听说它会变得混乱)。我还试图避免委派(如果这是正确的术语),因为我觉得它变得过于复杂了。此外,如果以下适用于一个,那么它应该适用于多个。
我在下面的代码中 post 探索了这两种方法。首先尝试分别传递每个文本字段,最初通过一个控制器名称,然后是多个。
其次,通过将所有字符串整理成一个可变数组,并尝试通过控制器传递这个数组,然后将这个数组拆分回 strings/text 用于标签文本。两次尝试都只传递按下“完成”按钮后活动文本字段的信息。
我在弱属性和强属性之间试过,并没有太大的区别。
故事板有 2 个视图控制器(ViewController 和第二个 ViewController),每个视图控制器都有自己的导航控制器,它们之间有一个 show segue。 ViewController 有 2 个文本字段。 secondViewController 有 2 个标签。
代码如下:
ViewController.h(对于字符串和数组方法)
#import <UIKit/UIKit.h>
#import "secondViewController.h"
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *textFieldData;
@property (weak, nonatomic) IBOutlet UITextField *textFieldDataTwo;
@end
ViewController.m(第一种方法):
(添加了 prepareforSegue)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
//UINavigationController *navController1 = (UINavigationController *)segue.destinationViewController;
secondViewController *svc = (secondViewController *)navController.topViewController;
secondViewController *svc1 = (secondViewController *)navController.topViewController;
//Also tried navController1.topViewController with previous comment
svc.labelText = _textFieldData.text;
svc1.labelTwoText = _textFieldDataTwo.text;
}
secondViewController.h(第一种方法)
# import <UIKit/UIKit.h>
@interface secondViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *labelSceneTwo;
@property (weak, nonatomic) IBOutlet UILabel *labelTwoSceneTwo;
@property (weak, nonatomic) NSString *labelText;
@property (weak, nonatomic) NSString *labelTwoText;
@end
第二种ViewController.m(第一种方法)
(仅添加到 viewDidLoad)
- (void)viewDidLoad {
[super viewDidLoad];
_labelSceneTwo.text = _labelText;
_labelTwoSceneTwo.text = _labelTwoText;
}
(我希望明天早上为第二种方法更新此 post)。
感谢您的宝贵时间。
更新 1:
对于方法 2,我目前得到一个 NSException 类型的未捕获异常。
在ViewController.m下prepareForSegue
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
secondViewController *svc = (secondViewController *)navController.topViewController;
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];
textFieldMArray = [[NSMutableArray alloc] init];
svc.labelTextMArray = textFieldMArray;
秒ViewController.h
已添加:
@property (strong,nonatomic) NSMutableArray *labelTextMArray;
秒ViewController.m
在视图中加载:
_labelTextMArray = [[NSMutableArray alloc] init];
//The line below is what is causing the termination, otherwise, screen shows 2 labels each saying "Label"
//If property of array is set to weak, then both labels appear blank.
_labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];
_labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];
最终工作代码:
方法二:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
secondViewController *controller = (secondViewController *)navController.topViewController;
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData.text, _textFieldDataTwo.text, nil];
controller.labelTextMArray = textFieldMArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
_labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];
_labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];
)
方法一:
几乎相同的代码,确保字符串也是 strong
,例如删除 weak
.
我们是如何到达那里的
首先,我建议稍微改变一下您的 prepareForSeque
方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//include the code for the navigationController
secondViewController *destinationController = (secondViewController *)segue.destinationViewController;
destinationController.labelText = self.textFieldData.text;
destinationController.labelTwoText = self.textFieldDataTwo.text;
}
您应该给 class 一个以大写字母开头的名称,例如 SecondViewController
,这只是基本的编码约定。
关于选项 2:
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];
svc.labelTextMArray = textFieldMArray;
您应该删除 prepareForSegue 和 viewDidLoad 中的行 _labelTextMArray = [[NSMutableArray alloc] init];
。
而且我不确定 navController.topViewController
是否按照您期望的方式工作,我不知道 topViewController 是否已经更新。我建议按照我已经写下的方式购买新的 viewController。
我是 Objective C 的新手,目前遇到上述问题。我已经学习了教程并尝试在此处找到相关主题,我可以让它为一个变量工作,但是我需要在视图控制器之间传递更多内容。
我试图避免使用全局变量、保存到临时文件和单例(模式)(?)(我听说它会变得混乱)。我还试图避免委派(如果这是正确的术语),因为我觉得它变得过于复杂了。此外,如果以下适用于一个,那么它应该适用于多个。
我在下面的代码中 post 探索了这两种方法。首先尝试分别传递每个文本字段,最初通过一个控制器名称,然后是多个。
其次,通过将所有字符串整理成一个可变数组,并尝试通过控制器传递这个数组,然后将这个数组拆分回 strings/text 用于标签文本。两次尝试都只传递按下“完成”按钮后活动文本字段的信息。
我在弱属性和强属性之间试过,并没有太大的区别。
故事板有 2 个视图控制器(ViewController 和第二个 ViewController),每个视图控制器都有自己的导航控制器,它们之间有一个 show segue。 ViewController 有 2 个文本字段。 secondViewController 有 2 个标签。
代码如下:
ViewController.h(对于字符串和数组方法)
#import <UIKit/UIKit.h>
#import "secondViewController.h"
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *textFieldData;
@property (weak, nonatomic) IBOutlet UITextField *textFieldDataTwo;
@end
ViewController.m(第一种方法): (添加了 prepareforSegue)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
//UINavigationController *navController1 = (UINavigationController *)segue.destinationViewController;
secondViewController *svc = (secondViewController *)navController.topViewController;
secondViewController *svc1 = (secondViewController *)navController.topViewController;
//Also tried navController1.topViewController with previous comment
svc.labelText = _textFieldData.text;
svc1.labelTwoText = _textFieldDataTwo.text;
}
secondViewController.h(第一种方法)
# import <UIKit/UIKit.h>
@interface secondViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *labelSceneTwo;
@property (weak, nonatomic) IBOutlet UILabel *labelTwoSceneTwo;
@property (weak, nonatomic) NSString *labelText;
@property (weak, nonatomic) NSString *labelTwoText;
@end
第二种ViewController.m(第一种方法)
(仅添加到 viewDidLoad)
- (void)viewDidLoad {
[super viewDidLoad];
_labelSceneTwo.text = _labelText;
_labelTwoSceneTwo.text = _labelTwoText;
}
(我希望明天早上为第二种方法更新此 post)。
感谢您的宝贵时间。
更新 1:
对于方法 2,我目前得到一个 NSException 类型的未捕获异常。
在ViewController.m下prepareForSegue
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
secondViewController *svc = (secondViewController *)navController.topViewController;
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];
textFieldMArray = [[NSMutableArray alloc] init];
svc.labelTextMArray = textFieldMArray;
秒ViewController.h
已添加:
@property (strong,nonatomic) NSMutableArray *labelTextMArray;
秒ViewController.m
在视图中加载:
_labelTextMArray = [[NSMutableArray alloc] init];
//The line below is what is causing the termination, otherwise, screen shows 2 labels each saying "Label"
//If property of array is set to weak, then both labels appear blank.
_labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];
_labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];
最终工作代码:
方法二:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
secondViewController *controller = (secondViewController *)navController.topViewController;
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData.text, _textFieldDataTwo.text, nil];
controller.labelTextMArray = textFieldMArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
_labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];
_labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];
)
方法一:
几乎相同的代码,确保字符串也是 strong
,例如删除 weak
.
我们是如何到达那里的
首先,我建议稍微改变一下您的 prepareForSeque
方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//include the code for the navigationController
secondViewController *destinationController = (secondViewController *)segue.destinationViewController;
destinationController.labelText = self.textFieldData.text;
destinationController.labelTwoText = self.textFieldDataTwo.text;
}
您应该给 class 一个以大写字母开头的名称,例如 SecondViewController
,这只是基本的编码约定。
关于选项 2:
NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];
svc.labelTextMArray = textFieldMArray;
您应该删除 prepareForSegue 和 viewDidLoad 中的行 _labelTextMArray = [[NSMutableArray alloc] init];
。
而且我不确定 navController.topViewController
是否按照您期望的方式工作,我不知道 topViewController 是否已经更新。我建议按照我已经写下的方式购买新的 viewController。