-1

在我MainClassCustomCell课堂上,我有两个视图,CustomCellMainClass. 我在这样的自定义单元格中有一个按钮

_(IBAction)click:sender

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

当我单击要更改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

}

我的 XIB 设计,

在此处输入图像描述

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

在此处输入图像描述

在此有一个带有名称和加号和减号按钮的视图,在运行时我有名称 1、名称 2 和名称 3 等。当我单击加号按钮时,将值从 1 增加到 ... 并显示计数标签,然后当我单击减号按钮时,我想减少计数标签值。我不知道该怎么做,任何知道的人都知道帮助我请。

4

3 回答 3

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
b。你的一个实例second-class被分配和实例化(这个实例是可用类型的对象second-class,在这种情况下被命名为sc
c.类 'second-class' 的 'sc' 实例调用方法

5。我们输入方法-(void) numberOfItem:(NSUInteger )no,在其中传递变量 'no',其中包含值:2(实际上它是对一块内存的引用,但你可以将其视为字面值 2)。
6. 编译器点击第一个 NSLog 语句,并用 NSUInteger 值替换 '%d' 格式化程序(这就是这个特定格式化程序的设计方式)。7. 编译器localtextbox.text = [NSString stringWithFormat:@"%d",no];使用'stringWithFormat'方法将NSUInteger 转换为NSString。这非常重要,否则 localtextbox.text 将保持为零。

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

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

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

您需要在 Connections Inspector 中重新访问您的 Connections。请按照以下步骤操作(当您开始不小心进行错误连接时,这很容易):
断开标签/文本字段连接
1. 打开项目的 .xib 文件。
2. 在屏幕右侧选择确保您的 Xcode 设置如下:
在此处输入图像描述
3. 在 .xib 文件中选择标签或文本字段(无论它是什么)。
4. 选择标签/文本字段后,导航到屏幕右侧并在身份检查器面板的上部工具栏中选择最右侧的选项(您可以将鼠标悬停在工具上,然后会出现工具提示上面写着“Connections Inspector”,它是一个圆圈,里面有一个指向右边的箭头:
在此处输入图像描述
5. 选择标签/文本字段(这些连接会根据所选接口对象而变化),删除所有连接,最重要的是“引用插座”。

重新连接标签/文本字段
1. 将您的 Xcode 布局更改为助手编辑器模式:
在此处输入图像描述
2. 只要您的 .xib 文件在您执行此操作时打开,Main.h 文件也应该打开(这是我们想要的)。
3. 在 Main.h 文件中添加一组花括号,使代码看起来像这样:

#import <UIKit/UIKit.h>

@interface Main : UIViewController {


}

@end

4. 将鼠标悬停在标签上,按住 control 从标签/文本字段拖动到这些花括号之间的区域并释放(执行此操作时应该看到一条蓝线)。像这样:

在此处输入图像描述

如图所示,应该会弹出一条消息,说明“创建奥特莱斯或奥特莱斯收藏”。我们要创建一个 Outlet (IBOutlet)。当你释放一个表单会弹出。我们要选择连接:'Outlet',将其命名为我们的 textfield:localtextfield 的名称,并确保引用是 'Weak'。像这样:
在此处输入图像描述
5. 单击“连接”,假设您已经说过的所有其他内容都可以正常工作,您的代码应该可以正常工作。

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

让我知道它是否仍然无法正常工作。

于 2013-04-17T12:33:50.510 回答
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 指南正确设计应用程序的说明。我的解释大约进行了一半,但还有很多要解释的。请在应用这些临时更改后回来查看。仍然会有一个小故障,直到用户按下“查看列表”按钮后,用户才会看到更新的计数。这是因为在选择“查看列表”按钮之前,应用程序实际上不会将添加的名称移动到“添加列表数组”。我的下一篇文章将纠正这个问题,并使用 UINavigationBar 在适当类型的结构中设置应用程序。

于 2013-04-22T07:22:31.580 回答
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

于 2013-04-16T04:26:43.683 回答