2011-06-30 60 views
2

我有两个视图 - 一个是我的iphone应用程序中的表视图和其他详细视图。当选中表中的一行时,将显示详细视图。iPhone:如何使UITextField,UITextView在切换视图时不可编辑

我使用笔尖编辑记录,添加新记录以及显示记录的详细视图。详细视图有一个UITextField和一个UITextView,当我只显示记录时,它需要被设置为不可编辑。在桌面的didSelectRowAtIndexPath方法我试过这...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Navigation logic may go here. Create and push another view controller. 
    MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil]; 

    memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath]; 

// making the text field and text view uneditable - DID NOT WORK??? 
     memoDetailViewController.memoTitleText.enabled = NO; 
     memoDetailViewController.memoTextView.editable = NO; 

    // Pass the selected object to the new view controller. 
    [self.navigationController pushViewController:memoDetailViewController animated:YES]; 
    [memoDetailViewController release]; 
} 

这是行不通的。 textfield和uitextview保持可编辑 - 当我点击它们时,键盘会出现。我在这里错过了什么?

回答

7

可能最简单的方法是使用它们各自的委托方法。他们是一样的,只有不同的名字。使用UITextField作为一个例子,你是基本的做法是这个

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    if (someCaseWhereYouWantToEdit) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

这让当你要让它继续编辑您指定。当然,你需要有文本框和TextView的实例与self作为他们的代表设置以及进口代理协议,在头

+0

这需要进入详细视图或表视图?我问,因为我需要控制从表格视图内的可编辑行为 - 当选择一行... – vikmalhotra

+0

这取决于你如何设置。如果你正在使用一个包含tableView的视图控制器,它将会进入实现文件。如果你使用的是tableViewController,它会进入该实现文件。每次你点击一个textField(和其相应的方法都是类似的textView)时,这个方法会被调用,所以你可以添加你想要的任何逻辑,让它知道什么时候继续编辑(返回YES),或者它应该是什么时候仅用于显示(返回NO) – justin

0

在认为应该是不可编辑视图控制器试试这个:

-(void)viewWillAppear:(BOOL)animated { 
    memoDetailViewController.memoTextView.editable = NO; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    memoDetailViewController.memoTextView.editable = YES; 
} 
1

代码不起作用,因为该视图尚未从XIB加载,因此这些属性为nil,并且发送至nil的效果为零。如果你改变了以pushViewController第一那么它应该工作

MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil]; 

memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath]; 

[self.navigationController pushViewController:memoDetailViewController animated:YES]; 

memoDetailViewController.memoTitleText.enabled = NO; 
memoDetailViewController.memoTextView.editable = NO; 

[memoDetailViewController release]; 

虽然这个作品,我会建议声明BOOL属性。将其设置为YESNO,然后使用其值viewWillAppear:方法启用或禁用字段。

4

你甚至可以禁止用户交互的特别XIB UI元素来启用

+1

正确,但是从内存中,这样做会修改组件的外观。我习惯这样做,因为这样用户知道该字段乍一看不可编辑,但它可能不是期望的行为。 (例如:如果你想弹出一个模式视图,将填补这个领域,而不是弹出键盘,让用户认为该字段被禁用不一定是个好主意。) – psycho

0

您也可在不同-2同时使用这两种视图控制器

-(void)viewDidAppear:(BOOL)animated 
{ 
    memoDetailViewController.memoTextView.editable = NO; 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
    memoDetailViewController.memoTextView.editable = YES; 
} 
0

你应该试试这个:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 

} 
相关问题