我尝试将数据从一个ViewController传递到secondControler,但似乎不起作用。我使用NSNotification。控制器具有相同的类别-2\f25 "ViewController“-2\f6
在视图控制器中。m
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(ProcessBarLoading) name:@"buttonPressed" object:nil];
}
-(void)ProcessBarLoading{
_labelTest.stringValue = @"TESTING";
}
- (IBAction)test:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"buttonPressed" object:self];
NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
[self presentViewControllerAsSheet:vc];
}当运行程序并按下按钮时,根本没有更新标签文本。你知道为什么我能修复。


新代码:在secudViewController.m中
@interface SencondViewController ()
@end
@implementation SencondViewController
@synthesize progressValue;
@synthesize labelView;
- (void)viewDidLoad {
[super viewDidLoad];
// Do view setup here.
labelView.stringValue =progressValue;
}在FirstViewCOntroller中:
- (IBAction)test:(id)sender {
self->uide = @"0";
[self performSegueWithIdentifier:@"showRecipeDetail" sender:self->uide];
NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
[self presentViewControllerAsSheet:vc];
- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
SencondViewController * secondVC = segue.destinationController;
secondVC.progressValue = uide;
}
}
- (IBAction)test2:(id)sender {
uide = @"80";
[self performSegueWithIdentifier:@"showRecipeDetail" sender:uide];
[self.view displayIfNeeded];
}因此,无论我是否按下按钮1(测试),其他Button2 (test2)总是显示具有更新值新视图。我需要的是只显示一个视图。
发布于 2018-08-23 00:22:01
为什么需要使用prepareForSegue最简单的方法是使用nsnotification或委派
这是一个示例
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if ([segue.identifier isEqualToString:@"myId"]) {
SecondViewController *vc = segue.destinationViewController;
vc.myDataToPass = self.myValueInMyFirstViewController;
}
}发布于 2018-08-23 00:39:34
不推荐使用
通知模式来执行此操作。当您想在某个事件上将某些数据传递给多个对象时,请使用通知。
要解决此问题,请执行以下操作:
步骤1:您应该将视图控制器名称更改为FirstViewController和SecondViewController,并在SecondViewController中声明一个要从FirstViewController设置其值的属性。
第2步:分段最后,在FirstViewController的prepare 方法中设置数据。
在Objective-C中,您可以尝试以下代码:
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
//This will trigger the prepareForSegue method
-(IBAction) someButtonClick {
[self performSegueWithIdentifier:@"YourSequeId" sender:nil];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecondViewController * secondVC = segue.destinationViewController;
secondVC.someValue = @"PassYourValueHere";
}
@end并在SecondViewController的头文件中声明属性:
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@property (nonatomic,strong) NSString *someValue;
@end在SecondViewController的实现文件中,写入:
#import "SecondViewController.h"
@interface SecondViewController ()
@property (nonatomic,weak) IBOutlet UITextField *yourTextField;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.yourTextField.text = self.someValue
// Do any additional setup after loading the view.
}
@endhttps://stackoverflow.com/questions/51970601
复制相似问题