从子视图自定义单元格刷新UI视图?

时间:2013-04-16 04:15:09

标签: iphone ios

在我的MainClassCustomCell课程中,我有两个视图,CustomCellMainClass的子视图。我有一个像这样的自定义单元格类的按钮

_(IBAction)click:sender

{
NSUInteger no =2;
second-class *sc = [[secondclass alloc] init];
[sc numberOfItem:no];
}

当我点击按钮时,我想更改Main类中的label,我的主类编码是

-(void)nuberofitem:no
{
NSLog(@"number : %d",no); //Its show correct value
localtextbox.text = no;

NSLog(@"text box value : %@",localtextbox.text); //But in  label it shows null value

}

MY XIB DESIGN,

enter image description here

我有这样的设计屏幕,在运行时我有像

这样的屏幕

enter image description here

在这个视图中有名称和加号和减号按钮,在运行时我有名字1,名字2和名字3等。当我点击加号按钮增加值从1到...并显示它计数标签,然后当我点击减号按钮我想减少计数标签值。我不知道该怎么做这件事可以任何知道知道帮助我请。

3 个答案:

答案 0 :(得分:2)

您的代码无法通过以下方法更新文本字段:

-(void)nuberofitem:no
{
NSLog(@"number : %d",no); //Its show correct value
localtextbox.text = no; // THIS IS WHERE YOU WENT WRONG

NSLog(@"text box value : %@",localtextbox.text); //But in  label it shows null value

}

localtextbox.text是UITextField或Label的一个属性,需要将NSString对象传递给它。您正在传递一个NSUInteger对象,该对象只能被读作' nil'由编译,因为它是一个错误类型的对象。为了更好地理解发生了什么,你必须像编译器一样阅读你的代码。

以下是计算机读取代码的方式:
1.应用程序不断循环以查看用户是否与其界面(事件循环)进行了交互 2.用户点击界面(.xib)文件上的按钮 3.事件循环暂停,注意到已按下按钮。它在Xcode中查看我们作为开发人员隐藏的xml信息,并查看其目标'属性。此目标属性包含指向'选择器的指针。 (这只是您的IBAction方法的一个奇特的词_(IBAction)click:sender
4.编译器使用Connections Inspector将此方法定位到您指向它的类中,并运行方法:

一个。声明NSUInteger并将其设置为值:2
湾分配并实例化second-class的实例(此实例是second-class类型的可用对象,在本例中名为sc
C。 ' sc'班级实例'二等'调用方法

5.我们输入方法-(void) numberOfItem:(NSUInteger )no,我们在其中传递变量' no'其中包含值:2(实际上它是对片段记忆的引用,但您可以将其视为字面值2)。
6.编译器命中第一个NSLog语句并替换'%d'具有NSUInteger值的格式化程序(这是此特定格式化程序的工作方式)。 7.编译器到达localtextbox.text = [NSString stringWithFormat:@"%d",no];并将NSUInteger转换为带有' stringWithFormat'的NSString。方法。这非常重要,否则localtextbox.text将保持为零。

到目前为止,一切都很完美,接下来Cocoa和Cocoa Touch如果我们使用界面构建器正确构建我们的界面,我们会为我们做一些工作。

只要我们遵循开发环境的规则,Xcode就内置了为我们完成大量工作的机制。标签会自动更新,如果他们的文字是'属性是更改,此更改将立即发生,但前提是我们已将textField或标签声明为IBOutlet(我们可以在代码中使用Interface Builder和Connections Inspector)。将标签设置为IBOutlet就像告诉textField或标签,"嘿标签,如果你的文字'属性已更改,然后更新您的视图以反映该更改。"您明确告诉它要注意更改,或者标签认为更改对于向用户显示的内容不重要。

如果您已将标签正确设置为IBOutlet,那么当localtextbox.text属性发生更改时,您的代码将自动更新视图,并将继续到下一行并正确记录localtextbox.text属性的值,因为它无论如何。

您需要在Connections Inspector中重新访问Connections。请按照以下步骤操作(当您开始意外地进行错误连接时可能很容易):
断开标签/文本字段连接
1.打开项目的.xib文件 2.在屏幕的右侧,选择确保您的Xcode设置如下:
enter image description here
3.在.xib文件中选择标签或textField(无论如何) 4.选择标签/ textField时,导航到屏幕右侧并在Identity Inspector面板的上方工具栏中选择最右侧的选项(您可以将鼠标悬停在工具上,并且应显示工具提示表示' Connections Inspector'这是一个箭头指向右边的圆圈:
enter image description here
5.选择标签/ textField(这些连接根据所选的界面对象而变化),删除所有连接,最重要的是“引用插座”。

重新签署标签/文本字段 1.将Xcode布局更改为助理编辑器模式:
enter image description here
2.只要你的.xib文件在你这样做时打开,Main.h文件也应该打开(这就是我们想要的)。
3.在Main.h文件中添加一组花括号,使代码如下所示:

#import <UIKit/UIKit.h>

@interface Main : UIViewController {


}

@end

4。将鼠标悬停在标签上,控制 - 从标签/ textField拖动到这些花括号之间的区域并释放(执行此操作时应看到蓝线)。像这样:

enter image description here

如图所示,应弹出一条消息说明,&#34;创建出口或出口集合&#34;。我们想要创建一个Outlet(IBOutlet)。当您发布表单时会弹出。我们要选择连接:&#39; Outlet&#39;,将其命名为textfield:localtextfield的名称,并确保引用为&#39; Weak&#39;。像这样:
enter image description here
5.单击&#34;连接&#34;并且您的代码应该可以正常运行,假设您已经说过的其他内容都有效。

这是UITableViewCell的子类吗?如果是这样,可以在操作方法中调用[[self tableview] reloadData];来手动更新tableview的单元格。

让我知道它是否仍然无效。

答案 1 :(得分:1)

现在我已经看到了你的完整项目,我发现你已经破坏了一些iOS约定。不用担心,这是一个快速解决方案,但要明白有更正确的方法来实现这一点:

将以下代码添加到sampleViewController.m:

// At the top near the other import statements
#import 'ViewController'

-(void)viewWillAppear:(BOOL)animated {

    // Update the count in the text box when the view appears
    [self updateTableCount];

}

// Custom Method for updating the display text of the property counttxt.text
- (void) updateTableCount {

    NSLog(@"Updating Table Count");

    // Get the count of records in the name array
    int numberOfNames = [[Table_viewctrl addlist_array] count];

    counttxt.text = [NSString stringWithFormat:@"%d", numberOfNames];
}

更新以下方法:

- (IBAction)add_namebtn:(id)sender 
{
    if(self.name_singleton != NULL)
    {
        selectname *sample_name = [[selectname alloc]init];
        sample_name.name = [nametxt text];
        [name_singleton Add:sample_name];

        nametxt.text=@"";
        [self.view endEditing:YES];

        // Update the count in the text box when the user adds a new name to the array
        [self updateTableCount];
    }
}

- (IBAction)viewlist_btn:(id)sender 
{
    self.Table_viewctrl = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    Table_viewctrl.view.frame = CGRectMake(0, 0, 320, 363);
    [self.subview addSubview:self.Table_viewctrl.view];
    [self loadnames];
    self.backbtn.hidden=FALSE;

    // Update the count in the text box when the view appears
    [self updateTableCount];
}

我将在几天内更新此答案,并说明如何根据iOS指南正确设计您的应用程序。我的解释只有一半,但还有很多东西需要解释。请在应用这些临时更改后再回来查看。仍然会出现故障,用户按下“查看列表”按钮后才会看到更新的计数。这是因为在选择“查看列表”按钮之前,应用程序实际上并未将添加的名称移动到“添加list_array”。我的下一篇文章将更正此问题,并使用UINavigationBar在适当类型的结构中设置应用程序。

答案 2 :(得分:0)

试试这个,

      -(void) numberOfItem:(NSUInteger )no
     {
      NSLog(@"number : %d",no); //Its show correct value
      localtextbox.text = [NSString stringWithFormat:@"%d",no];

      NSLog(@"text box value : %@",[NSString stringWithFormat:@"%d",localtextbox.text]); //But in  label it shows null value

   }

并检查您是否已在IBOutlet

中正确关联localtextbox xib {{1}}