2014-03-03 151 views
0

我有一个视图控制器(VC)有3个按钮(国家,州,市)。点击这些按钮后,我将展示另一个VC(使用popover segue),这是一个搜索表来搜索国家(或州或城市)。现在,如果用户单击两个按钮,则同时显示两个视图控制器。我只想要一个人。如何做到这一点?禁用多点触摸不工作ios

尝试self.view.multipleTouchEnabled = NO;但不工作。 代码searchVC的:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    UIImage *bgApplication = [UIImage imageNamed:@"bg-app-568h.jpg"]; 
    self.view.backgroundColor = [UIColor colorWithPatternImage:bgApplication]; 

    self.searchItems = [self loadData]; 
    self.filteredSearchItems = [NSMutableArray arrayWithCapacity:[self.searchItems count]]; 

    for (UIView *view in self.SearchBarBase.subviews){ 
     if ([view isKindOfClass: [UITextField class]]) { 
      UITextField *tf = (UITextField *)view; 
      tf.delegate = self; 
      break; 
     } 
    } 
} 

- (NSArray *)loadData 
{ 
    MatchDayDataController * sharedController = [MatchDayDataController sharedDataController]; 
    NSArray *data = [sharedController fetchStates]; 
    //NSLog(@"states: %@", data); 

    return data; 
} 

主持人VC的代码:

-(void) viewWillAppear:(BOOL)animated 
{ 
    keyboardIsShown = NO; 

    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 

    // Load match venue data 
    self.locationField.text = sharedController.matchVenue; 

    //Load home team related data 
    NSString *stateText = [sharedController.homeStateName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    if ([stateText length] == 0) 
    { 
     self.selectHomeAssoc.enabled = NO; 
     self.selectHomeClub.enabled = NO; 
    } 
    NSString *homeAssocText = [sharedController.homeAssociationName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    if ([homeAssocText length] == 0) 
    { 
     self.selectHomeAssoc.enabled = YES; 
     self.selectHomeClub.enabled = NO; 
    } 
    NSString *homeClubText = [self.homeClub.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    if ([homeClubText length] == 0) 
    { 
     self.selectHomeClub.enabled = YES; 
    } 

    self.stateTextFieldHome.text = sharedController.homeStateName; 
    self.homeAssociation.text = sharedController.homeAssociationName; 
    self.homeClub.text = sharedController.homeClubName;; 
    self.homeTeam.text = sharedController.homeTeamName; 

    // Away team related data 
    self.stateTextFieldAway.text = sharedController.awayStateName; 
    self.awayAssociation.text = sharedController.awayAssocationName; 
    self.awayClub.text = sharedController.awayClubName; 
    self.awayTeam.text = sharedController.awayTeamName; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillHideNotification 
                object:nil]; 

    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 

    sharedController.matchVenue = self.locationField.text; 

    // Save Venue related data 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm"]; 
    NSString *dateTimeString = [self.dateField.text stringByAppendingString:@" "]; 

    dateTimeString = [dateTimeString stringByAppendingString:self.timeField.text]; 
    //NSLog(@"DateTimeString : %@", dateTimeString); 
    NSDate *matchDateTime = [dateFormatter dateFromString:dateTimeString]; 
    sharedController.inspectionDate = matchDateTime; 

    //Save Home team related data 
    sharedController.homeTeamName = self.homeTeam.text; 
    // Save away team related data 
    sharedController.awayTeamName = self.awayTeam.text; 
    [sharedController saveData]; 

    // hide the keyboard when we come back after leaving the cursor on text field. 
    // I have called resignFirstResponder on homeTeam Text field. You can use any of text field to hide. 
    [self.homeTeam resignFirstResponder]; 
    [self.awayTeam resignFirstResponder]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [self.view endEditing:YES]; 
    [super viewDidDisappear:animated]; 
} 


// This event is called when the user clicks on Done/Next button in the key board. 
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return NO; 
} 

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)segue sender:(id)sender 
{ 
    if (![sender isKindOfClass:[UIBarButtonItem class]]) { 
     return true; 
    } 

    return [JLTValidator validateFields:@[self.locationField, self.dateField, self.timeField, self.homeTeam, self.homeClub, self.homeAssociation, self.stateTextFieldHome, self.stateTextFieldAway, self.awayAssociation, self.awayClub, self.awayTeam]]; 
} 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    //NSLog(@"segue.identifier : %@", segue.identifier); 
    self.popSegue = (UIStoryboardPopoverSegue *)segue; 
    if([segue.identifier isEqualToString:@"toSearchHomeStateFromButton"] 
     || [segue.identifier isEqualToString:@"toSearchHomeStateFromText"]) 
    { 
     SearchHomeStateViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
    else if ([segue.identifier isEqualToString:@"toSearchHomeAssocFromButton"] || [segue.identifier isEqualToString:@"toSearchHomeAssocFromText"]) 
    { 
     HomeAssocSearchViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
    else if ([segue.identifier isEqualToString:@"toSearchHomeClubFromButton"] || [segue.identifier isEqualToString:@"toSearchHomeClubFromText"]) 
    { 
     SearchHomeClubViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
    else if([segue.identifier isEqualToString:@"toSearchAwayStateFromButton"] || [segue.identifier isEqualToString:@"toSearchAwayStateFromText"]) 
    { 
     StateViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
    else if ([segue.identifier isEqualToString:@"toSearchAwayAssocFromButton"] || [segue.identifier isEqualToString:@"toSearchAwayAssocFromText"]) 
    { 
     SearchAwayAssocViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
    else if ([segue.identifier isEqualToString:@"toSearchAwayClubFromButton"] || [segue.identifier isEqualToString:@"toSearchAwayClubFromText"]) 
    { 
     SearchAwayClubViewController *viewController = segue.destinationViewController; 
     viewController.delegate = (id) self; 
    } 
} 

-(void) searchHomeStateDone:(NSString *)selectedState 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.stateAwayTeam = sharedController.stateHomeTeam; 
    sharedController.homeTeamName = EMPTY_STRING; 
    sharedController.awayStateName = sharedController.homeStateName; 
    sharedController.awayAssocationName = EMPTY_STRING; 
    sharedController.awayAssociationId = EMPTY_STRING; 
    sharedController.awayClubName = EMPTY_STRING; 
    sharedController.awayClubId = EMPTY_STRING; 

    [self updateDataOnScreen]; 
    self.selectHomeAssoc.enabled = YES; 
    self.selectHomeClub.enabled = NO; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
} 

-(void) searchHomeAssocDone:(NSString *)selectedHomeAssoc 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.awayAssocationName = sharedController.homeAssociationName; 
    sharedController.homeTeamName = EMPTY_STRING; 
    sharedController.awayStateName = sharedController.homeStateName; 
    sharedController.awayAssociationId = sharedController.homeAssociationId; 
    sharedController.awayClubName = EMPTY_STRING; 
    sharedController.awayClubId = EMPTY_STRING; 

    [self updateDataOnScreen]; 
    self.selectHomeClub.enabled = YES; 
    [JLTValidator clearTextFieldValidation:self.homeAssociation]; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
} 

-(void) searchHomeClubDone:(NSString *)selectedHomeClub 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.homeTeamName = EMPTY_STRING; 

    [self updateDataOnScreen]; 
    [JLTValidator clearTextFieldValidation:self.homeClub]; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 

} 

-(void) searchAwayStateDone:(NSString *)selectedAwayState 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.homeTeamName = self.homeTeam.text; 

    [self updateDataOnScreen]; 
    [JLTValidator clearTextFieldValidation:self.stateTextFieldAway]; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
} 

-(void) searchAwayAssocDone:(NSString *)selectedAwayAssoc 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.homeTeamName = self.homeTeam.text; 

    [self updateDataOnScreen]; 
    [JLTValidator clearTextFieldValidation:_awayAssociation]; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
} 

-(void) searchAwayClubDone:(NSString *) selectedAwayClub; 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 
    sharedController.homeTeamName = self.homeTeam.text; 

    [self updateDataOnScreen]; 
    [JLTValidator clearTextFieldValidation:_awayClub]; 
    [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
} 

-(void) updateDataOnScreen 
{ 
    MatchDayDataController *sharedController = [MatchDayDataController sharedDataController]; 

    // sharedController.awayTeamName = EMPTY_STRING; 

    self.stateTextFieldHome.text = sharedController.homeStateName; 
    self.homeAssociation.text =sharedController.homeAssociationName; 
    self.homeClub.text = sharedController.homeClubName; 
    self.homeTeam.text = sharedController.homeTeamName; 
    self.stateTextFieldAway.text = sharedController.awayStateName; 
    self.awayAssociation.text = sharedController.awayAssocationName; 
    self.awayClub.text = sharedController.awayClubName; 
    //self.awayTeam.text = sharedController.awayTeamName; 
} 

任何想法?

感谢,

+0

请分享一些可以帮助你的代码。 :) – Rashad

+0

self.view.multipleTouchEnabled = NO不应该工作,因为每个按钮是一个差异视图。 –

+0

触摸后您的按钮是否可用?或者用户是否必须同时打两个按钮?为什么这是一个问题?有一件事你可以尝试,就是让一个方法处理所有三个按钮,然后在运行时设置一个标志。如果设置了该标志,代码将不会执行,因此如果该方法被调用两次,代码只运行一次。当你返回到vc时(例如,在结果视图中调用的协议方法中),你重置标志 – Moonwalkr

回答

0

尝试self.view.exclusiveTouch = YES;

+0

不,这是一个坏主意。从文档:“默认情况下,视图的exclusiveTouch属性设置为NO。如果将该属性设置为YES,则标记该视图,以便如果正在跟踪触摸,则它是窗口中唯一跟踪触摸的视图在窗口中的其他意见不能接受这些接触。“ – Moonwalkr

1

您可以创建这个变量的静态布尔变量busy,并在每个按钮的操作方法的第一线检查状态。如果busy等于NO,则将她设置为YES,并在最后一行操作方法或其他位置将其设置为NO。如果busy等于YES做动作返回的方法。所以,直到第一个被调用的方法没有完成,没有其他方法会运行。

@implementation yourController 

-(void)changeCountry 
{ 
    if (!busy) 
    { 
     busy = YES; 
     // do what you need 
    } else return; 
} 

-(void)changeState 
{ 
    if (!busy) 
    { 
     busy = YES; 
     // do what you need 
    } else return; 
} 

@end 

您应该执行单,与布尔值返回一个静态实例使用他差viewControllers(1 mainC + 3 popOverC),并设置busyNO当你完成版。

+0

同意你的看法,只不过第二个按钮动作会在第一个动作完成时触发(全部在同一个主线程中)。此外,我建议通过'[self performSelector:@selector(resetBusy)withObject:nil afterDelay:0];''用' - (void)resetBusy {busy = NO;} '(这会在主线程的下一个循环) –