【问题标题】:NSTimer link with UIPickerView iOSNSTimer 与 UIPickerView iOS 的链接
【发布时间】:2015-10-20 09:18:30
【问题描述】:

我有一个 UIPickerView,在一个视图控制器中有一个数组,在另一个视图控制器中有一个 NSTimer,我正在尝试:

1) 将选取器数组链接到 NSTimer,以便用户在选取器上选择一个时间以使图像自毁

2) 在 UILabel 中显示剩余时间,因此用户选择的秒数下降到 0。(例如,从选择器标签中选择 2 显示 2 然后 1 然后 0 和图像破坏) em>

one vc.h

@property (strong, nonatomic) IBOutlet UIPickerView *timePicker;
@property (nonatomic, strong) NSArray *pickerData;

one vc.m 

- (void)viewDidLoad {
    [super viewDidLoad];

    self.pickerData = @[@1,@2,@3,@4,@5,@6,@7];

    self.timePicker.dataSource = self;
    self.timePicker.delegate = self;
}

- (void) viewWillAppear:(BOOL)animated {

    [self.textField setText:self.userText];
}

-(long)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

-(long)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return self.pickerData.count;
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    [self.pickerData objectAtIndex:[self.timePicker selectedRowInComponent:0]];
}


two vc.h

@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@property (nonatomic, assign) int seconds;

two vc.m

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

            [NSTimer scheduledTimerWithTimeInterval:7 target:self selector:@selector(timeout)
                                           userInfo:nil repeats:NO];

    [NSTimer scheduledTimerWithTimeInterval:self.seconds target:self selector:@selector(setTimeToLabel) userInfo:nil repeats:NO];
}

-(void)timeout
{
 // pops to root view
}


- (void)setTimeToLabel
{  
    self.seconds = self.seconds - 1;
    self.timeLabel.text = [NSString stringWithFormat:@"%d", self.seconds];
}

NSTimer 不响应 self.seconds 并且不从 UIPicker 获取用户输入。

关于如何将选择器链接到计时器以便计时器响应用户在选择器中选择的秒数并在标签中显示剩余秒数的任何想法??

我的prepareforsegue方法如下:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([segue.destinationViewController isKindOfClass:[oneViewController class]]) {
        oneViewController * ovc = (oneViewController*)segue.destinationViewController;
        ovc.array = //whatever;
    }

    if  ([segue.destinationViewController isEqual:@"secondVC"]) {
            NSInteger row = [self.timePicker selectedRowInComponent:0];
            twoViewController *tvc = [segue destinationViewController];
            tvc.seconds = [[self.pickerData objectAtIndex:row] intValue];
    }
}

这可能是什么问题,onviewcontroller 方法有效,无论我传递什么它都有效,但是对于 tvc.seconds 没有任何东西传递给它。

【问题讨论】:

  • 如果你在两个 viewDidAppear 中 NSLog self.seconds 你会得到什么?
  • 在控制台显示0
  • 如何将用户输入值从一个控制器传递到另一个控制器?
  • 你是什么意思?我尝试传递调用 twoViewController 的值,然后分配和初始化它。
  • 所以我在ibaction next中使用这个方法按钮 ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.isSomethingEnabled = YES; [self pushViewController:viewControllerB animated:YES];

标签: ios objective-c nsarray uipickerview nstimer


【解决方案1】:

您正在创建控制器的一个新实例,而不是将要使用的实际实例。您应该使用prepareForSegue 方法来执行此操作,并获取对destinationViewController 的引用,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqual: @"nextScreen"]) {
        NSInteger row = [self.timePicker selectedRowInComponent:0];
        SecondViewController *tvc = [segue destinationViewController];
        tvc.seconds = [[self.pickerData objectAtIndex:row] intValue];
    }
}

// First View Controller
//.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UIPickerView *timePicker;
@property (nonatomic, strong) NSArray *pickerData;
@property (weak, nonatomic) IBOutlet UIButton *next;

@end

//.m
#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController () <UIPickerViewDataSource, UIPickerViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.pickerData = @[@1,@2,@3,@4,@5,@6,@7];

    self.timePicker.dataSource = self;
    self.timePicker.delegate = self;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return self.pickerData.count;
}

- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [NSString stringWithFormat: @"%@", self.pickerData[row]];
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    [self.pickerData objectAtIndex:[self.timePicker selectedRowInComponent:0]];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqual: @"nextScreen"]) {
        NSInteger row = [self.timePicker selectedRowInComponent:0];
        SecondViewController *tvc = [segue destinationViewController];
        tvc.seconds = [[self.pickerData objectAtIndex:row] intValue];
    }
}

@end

// SecondViewController
//.h
#import "ViewController.h"

@interface SecondViewController : ViewController

@property (nonatomic) int seconds;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;

@end


//.m
#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [NSTimer scheduledTimerWithTimeInterval:7 target:self selector:@selector(timeout)
                                   userInfo:nil repeats:NO];

    [NSTimer scheduledTimerWithTimeInterval:self.seconds target:self selector:@selector(setTimeToLabel) userInfo:nil repeats:NO];
}

-(void)timeout
{
    // pops to root view
}


- (void)setTimeToLabel
{
    self.seconds = self.seconds - 1;
    self.timeLabel.text = [NSString stringWithFormat:@"%d", self.seconds];
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2014-02-24
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多