gpt4 book ai didi

iphone - 使用委托(delegate)和 Storyboard传回数据

转载 作者:行者123 更新时间:2023-12-03 20:15:20 25 4
gpt4 key购买 nike

我在掌握在我正在开发的应用程序中使用带有 Storyboard 的委托(delegate)的窍门时遇到了一些问题。我查看了其他一些搜索,包括 Passing data back :Delegate method not called ,但无济于事。此时,我已经删除了应用程序中的所有内容,除了两个 View 的基础知识之外。第一个 View 是一个基本 View Controller ,带有一个按钮,按下该按钮后,会转到模态视图,其中在文本字段中输入一条数据。该模态视图上有一个“保存”按钮,按下该按钮后,将返回到第一个 View 。当然,我也想将输入的数据发送回第一个 View 。听起来很简单?当然可以,但是在某个地方我无法让它工作。看来我的代表电话从未发出过。代码如下:

MyDayViewController.h - 这是第一个 View Controller

#import <UIKit/UIKit.h>
#import "AddRatingModalViewController.h"

@interface MyDayViewController : UIViewController <AddRatingDelegate>

@property (strong, nonatomic) IBOutlet UIButton *addRatingBtn;
@property (strong, nonatomic) IBOutlet UIButton *addAccompBtn;
@property (strong, nonatomic) IBOutlet UILabel *ratingLabel;

@end

MyDayViewController.m

#import "MyDayViewController.h"

@implementation MyDayViewController
@synthesize addRatingBtn;
@synthesize addAccompBtn;
@synthesize ratingLabel;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ToRatingVC"])
{
NSLog(@"Setting MyDayVC as a delegate of AddRatingMVC");

AddRatingModalViewController *addRatingController = segue.destinationViewController;
addRatingController.delegate = self;
}
}

- (void)theSaveButtonTapped:(AddRatingModalViewController *)controller withRating:(NSNumber*) rating
{
NSLog(@"In theSaveButtonTapped method of MyDayVC");
ratingLabel.text = [[NSString alloc]initWithFormat:@"%@", rating];

[self dismissModalViewControllerAnimated:YES];
}

- (void)viewDidUnload
{
[self setAddRatingBtn:nil];
[self setAddAccompBtn:nil];
[self setRatingLabel:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

@end

AddRatingModalViewController.h - 这是模态视图 Controller

#import <UIKit/UIKit.h>

@class AddRatingModalViewController;

@protocol AddRatingDelegate
- (void)theSaveButtonTapped:(AddRatingModalViewController *)controller withRating:(NSNumber*) rating;
@end

@interface AddRatingModalViewController : UIViewController

@property (nonatomic, weak) id <AddRatingDelegate> delegate;
@property (strong, nonatomic) IBOutlet UITextField *addRatingTextField;

- (IBAction)cancelBtnPressed:(id)sender;
- (IBAction)saveBtnPressed:(id)sender;

@end

AddRatingModalViewController.m

#import "AddRatingModalViewController.h"

@implementation AddRatingModalViewController
@synthesize addRatingTextField;
@synthesize delegate;

- (IBAction)cancelBtnPressed:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}

- (IBAction)saveBtnPressed:(id)sender {
NSNumber *ratingARMVC = [NSNumber numberWithInteger:[addRatingTextField.text integerValue]];
NSLog(@"The entered Rating in ARMVC is %@", ratingARMVC);

NSLog(@"Telling the MyDayVC Delegate that Save was tapped on the AddRatingTVC");
[self.delegate theSaveButtonTapped:self withRating:ratingARMVC];

}

- (void)viewDidUnload
{
[self setAddRatingTextField:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

@end

控制台的输出如下:

2012-07-16 16:49:16.384 MyDayDelTest[4695:f803] Setting MyDayVC as a delegate of AddRatingMVC
2012-07-16 16:49:39.274 MyDayDelTest[4695:f803] The entered Rating in ARMVC is 7
2012-07-16 16:49:39.275 MyDayDelTest[4695:f803] Telling the MyDayVC Delegate that Save was tapped on the AddRatingTVC

这正好是在 Save 方法中进行委托(delegate)调用之前。任何帮助将不胜感激!我应该说,当我不使用 Storyboard时,测试可以工作,但我确实需要它与 Storyboard一起使用,因为我的应用程序的其余部分使用它们。提前致谢。

最佳答案

@pina0004 发现 an answer here 。总之,如果推送的 VC 实际上是 UINavigationController 的根 VC,则 segue destinationViewController 将不会指向推送的 VC,而是(不太直观)指向它作为根的导航 Controller 。

这已经解决了,但我认为这是过度使用委托(delegate)模式的一个例子。在这种情况下,推送的 VC 需要向原始 VC 报告一个字符串,并且问题使用指向原始 VC 的委托(delegate)指针,其唯一的“委托(delegate)”工作是保存字符串并关闭模态 VC。我认为还有更好的选择:

  • 传递模型:不要告诉推送的 VC 谁是推送的 VC,而是给它一个指向其模型的指针(在本例中为字符串)。让被推送的 VC 改变模型,然后使用多种技术之一让推送者发现模型已经改变。
  • 自行解散:从方法的命名方式来看,这一点不是很明显,但模态呈现的 VC 可以自行解散。推送的 VC 可以在其 viewWillAppear 方法中检查模型状态,该方法将在推送的 VC 即将消失时运行。
  • KVO :原始 VC 可以要求在特定模型属性发生更改时得到通知。这将使推送发现模型状态更改,并在需要时关闭模态 VC。
  • Notification :推送的 VC 或模型都可以发布状态更改的通知。推送的 VC 可以订阅此消息并做出响应。这对于应用可能更普遍感兴趣的状态更改特别有帮助。
  • Blocks :推送 VC 可以使用 block 来移交一些在重要事件发生时应该运行的代码。该 block 在推送 VC 的上下文中运行。这是一种非常易读的方法,可以使因果代码块彼此靠近,甚至共享相同的变量名称。

关于iphone - 使用委托(delegate)和 Storyboard传回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com