2010-05-09 72 views
0

对,我试图做一个应用程序,其计算涉及秒表。点击计算视图上的按钮时,秒表将从底部滑入。这一切都正常,我无法理解的问题是如何将记录的时间发送回前一个控制器来更新文本字段。iPhone幻灯片查看传递变量

我已经简化了代码并删除了大部分不相关的东西。

非常感谢。

CalculationViewController.h

#import <UIKit/UIKit.h> 

@interface CalculationViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 

IBOutlet UITextField *inputTxt; 
} 
@property (nonatomic, retain) UITextField *inputTxt; 

- (IBAction)showTimer:(id)sender; 
@end 

CalculationViewController.m

#import "CalculationViewController.h" 
#import "TimerViewController.h" 

@implementation CalculationViewController 

- (IBAction)showTimer:(id)sender { 

    TimerViewController *timerView = [[TimerViewController alloc] init]; 
    [self.navigationController presentModalViewController:timerView animated:YES]; 
} 

TimerViewController.h

#import <UIKit/UIKit.h> 

@interface TimerViewController : UIViewController { 

IBOutlet UILabel *time; 
NSTimer *myTicker; 
} 

- (IBAction)start; 
- (IBAction)stop; 
- (IBAction)reset; 
- (void)showActivity; 
@end 

TimerViewController.m

#import "TimerViewController.h" 
#import "CalculationViewController.h" 

@implementation TimerViewController 

- (IBAction)start { 
myTicker = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]; 
} 

- (IBAction)stop { 
[myTicker invalidate]; 

#Update inputTxt on calculation view here 

[self dismissModalViewControllerAnimated:YES]; 
} 

- (IBAction)reset { 
time.text = @"0"; 
} 

- (void)showActivity { 
int currentTime = [time.text intValue]; 
int newTime = currentTime + 1; 

time.text = [NSString stringWithFormat:@"%d", newTime]; 
} 
@end 

回答

2

一对夫妇的方式做到这一点是:

  • 使用NSNotificationCenter,或
  • 使CalculationViewController TimerViewController的代表(定义CalculationViewController实现协议)

在这两种情况下, TimerViewController会通知CalculationViewController它已完成并同时传递数据。所以在停止方法中,它会执行postNotificationName:object:userInfo或调用委托方法。然后,当它接收到通知时,解除会在CalculationViewController中完成。

编辑:
不一定有每次一个正确的方式。根据应用程序的大小和复杂程度以及情况的确切要求,有些方法比其他方法更好。应用程序委托可以跨视图控制器共享数据,但使用通知或委托在控制器间传递事件可能更好,就像您想在此处执行的操作一样。

协议是比通知更严格,更自我记录和独立的方法,但对于这种简单的情况,任何一个都没问题。

这里是如何使用协议/委托方式实现:

TimerViewController.h:

@protocol TimerViewDelegate 
-(void)timerStopped:(NSString *)timerData; 
@end 
@interface TimerViewController : UIViewController { 
    //other ivars... 
    id<TimerViewDelegate> delegate; 
} 
//other properties... 
@property (nonatomic, assign) id <TimerViewDelegate> delegate; 
//method declarations... 
@end 

TimerViewController.m:

@implementation TimerViewController 
@synthesize delegate; 
- (IBAction)stop { 
    [myTicker invalidate]; 
    NSString *timerData = @"timer data here"; 
    [self.delegate timerStopped:timerData]; 
} 
@end 

CalculationViewController.h:

#import "TimerViewController.h" 
@interface CalculationViewController : UIViewController 
    <UITableViewDelegate, UITableViewDataSource, TimerViewDelegate > { 
    ... 
} 
@end 

CalculationViewController。L:

- (IBAction)showTimer:(id)sender { 
    TimerViewController *timerView = [[TimerViewController alloc] init]; 
    timerView.delegate = self; 
    [self.navigationController presentModalViewController:timerView animated:YES]; 
    [timerView release]; 
} 

- (void)timerStopped:(NSString *)timerData 
{ 
    inputTxt.text = timerData; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

而这里的通知版本:

CalculationViewController.m:

- (IBAction)showTimer:(id)sender { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(timerStopped:) name:@"timerStopped" object:nil]; 
    TimerViewController *timerView = [[TimerViewController alloc] init]; 
    [self.navigationController presentModalViewController:timerView animated:YES]; 
    [timerView release]; 
} 
- (void)timerStopped:(NSNotification*)notification 
{ 
    NSString *timerData = [[notification userInfo] objectForKey:@"timerData"]; 
    inputTxt.text = timerData; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

TimerViewController.m:

- (IBAction)stop { 
    [myTicker invalidate]; 
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"timer data here" forKey:@"timerData"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"timerStopped" object:self userInfo:dict]; 
} 

在这个非常简单的情况下,通知的外观好的使用。在任何一种情况下,控制器都不必知道彼此的内部细节,也不需要像应用程序代理那样依赖第三方。他们只需要就通知名称和用户信息键达成一致。协议方法更严格,但自我记录。

+0

这是做“正确”的方式吗?我使用主应用程序委托来处理它,但最好是让计算视图控制器成为定时器视图控制器的代表。你会用什么代码来做到这一点?谢谢你的帮助。 – sebastyuiop 2010-05-09 14:29:40

+0

将添加详细信息以尽快解答。 – DyingCactus 2010-05-09 17:29:18

+0

非常感谢,我会在早上给它一个去。 – sebastyuiop 2010-05-09 23:41:00