首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用单例连接一组按钮?

如何使用单例连接一组按钮?
EN

Stack Overflow用户
提问于 2012-02-05 02:25:11
回答 3查看 771关注 0票数 1

我的appDelegate,在方法didFinishLaunchingWithOptions中,我加载我的视图控制器,然后创建一个单例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UIViewController *MainWinVC = [[p3VC alloc] init];
[[self window] setRootViewController:MainWinVC];
ansButSingleton *ansButs = [[ansButSingleton alloc] init]; 

ansButSingleton.h看起来像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <Foundation/Foundation.h>

@interface ansButSingleton : NSObject {

    // View objects:

    UIButton *Ans1;
    UIButton *Ans2;
    UIButton *Ans3;
    UIButton *Ans4;
    UIButton *Ans5;
    UIButton *Ans6;
    UIButton *Ans7;
    UIButton *Ans8;

    // Other objects:

    NSArray *ansButs;

}

@property (strong) UIButton *Ans1, *Ans2, *Ans3, *Ans4, *Ans5, *Ans6, *Ans7, *Ans8;
@property (strong) NSArray *ansButs;

+ (ansButSingleton *) ansButsName;  // Declare class method
@end

和ansButSingleton.m像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "ansButSingleton.h"

@implementation ansButSingleton

static ansButSingleton *ansButsName;

@synthesize Ans1, Ans2, Ans3, Ans4, Ans5, Ans6, Ans7, Ans8;
@synthesize ansButs;

//////////////////// instantiate ////////////////////

+ (ansButSingleton *) ansButsName { // class method

    @synchronized(self)
    {
        if (!ansButsName)
            ansButsName = [[ansButSingleton alloc] init];        
        return ansButsName;
    }
}

//////////////////// initialize ////////////////////

- (id)init { // class instance method

    NSLog(@"Initializing answer buttons");

    if (ansButsName) {
        return ansButsName;
    }

    self = [super init];

    if(self) {

        // First initialze the individual buttons

        self.Ans1 = [[UIButton alloc] init];
        [Ans1 setTitle:@"" forState:UIControlStateNormal];
        self.Ans2 = [[UIButton alloc] init];
        [Ans2 setTitle:@"" forState:UIControlStateNormal];
        self.Ans3 = [[UIButton alloc] init];
        [Ans3 setTitle:@"" forState:UIControlStateNormal];
        self.Ans4 = [[UIButton alloc] init];
        [Ans4 setTitle:@"" forState:UIControlStateNormal];
        self.Ans5 = [[UIButton alloc] init];
        [Ans5 setTitle:@"" forState:UIControlStateNormal];
        self.Ans6 = [[UIButton alloc] init];
        [Ans6 setTitle:@"" forState:UIControlStateNormal];
        self.Ans7 = [[UIButton alloc] init];
        [Ans7 setTitle:@"" forState:UIControlStateNormal];
        self.Ans8 = [[UIButton alloc] init];
        [Ans8 setTitle:@"" forState:UIControlStateNormal];

        // Make an array containing the objects: this is the objective-C way!

        self.ansButs = [[NSArray alloc] initWithObjects: Ans1, Ans2, Ans3, Ans4, Ans5, Ans6, Ans7, Ans8, nil];
    }

    NSLog(@"Done initializing answer buttons");

    return self;
}
@end

这段代码构建并运行良好(目前还不能做太多工作)。由于压头加载成功,按钮是可见的。但是,它们不是活动的,因为我没有将它们连接到代码(没有IBActions)。

问:如何将以这种方式创建的按钮连接到笔尖中的按钮?如果这些是简单的按钮(而不是一组按钮),我会创建一个方法,并使用IBAction作为该方法声明的一部分。但这个案例看起来有点不同。也可能不是。如果这些是标签(我稍后也需要这样做),我的阅读使我相信IBOutletCollection可能会工作,但我看不到IBActionCollection。需要专家指导!谢谢。

编辑...和Rob一起工作来实现他的想法。我的viewLoad方法是从你的方法中复制和粘贴的,但也许其中有我需要更改的地方?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma mark - View lifecycle

 - (void)loadView {
 NSDictionary *externals = [NSDictionary dictionaryWithObject:[AnswerButtons answerButtons]
 forKey:@"answerButtons"];
 NSDictionary *nibOptions = [NSDictionary dictionaryWithObject:externals
 forKey:UINibExternalObjects];
 [self.nibBundle loadNibNamed:self.nibName owner:self options:nibOptions];
 [[AnswerButtons answerButtons] buttonsDidLoad];
 }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-05 05:34:56

有许多方法可以做到这一点。我会通过将单例的连接连接到笔尖来实现的。下面是如何实现的。

首先,让我们修复单例类以匹配iOS编程约定,并提供对连接nib中的按钮连接的支持:

AnswerButtons.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <Foundation/Foundation.h>

@interface AnswerButtons : NSObject

@property (strong, nonatomic) IBOutlet UIButton *button1, *button2, *button3, *button4, *button5, *button6, *button7, *button8;
@property (strong, nonatomic, readonly) NSArray *buttons;

+ (AnswerButtons *)answerButtons;

- (void)buttonsDidLoad;

@end

AnswerButtons.m

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "AnswerButtons.h"

@implementation AnswerButtons

@synthesize button1 = _button1;
@synthesize button2 = _button2;
@synthesize button3 = _button3;
@synthesize button4 = _button4;
@synthesize button5 = _button5;
@synthesize button6 = _button6;
@synthesize button7 = _button7;
@synthesize button8 = _button8;

@synthesize buttons = _buttons;

+ (AnswerButtons *)answerButtons {
    static AnswerButtons *singleton;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        singleton = [[AnswerButtons alloc] init];
    });
    return singleton;
}

- (void)buttonsDidLoad {
    _buttons = [[NSArray alloc] initWithObjects:_button1, _button2, _button3, _button4, _button5, _button6, _button7, _button8, nil];
}

@end

注意,在第一次请求单例时,我们在类方法中创建了单例。不要在application:didFinishLaunchingWithOptions:中这样做。

下一步,让我们把按钮挂在笔尖上:

  1. 打开p3VC类的半边。(您应该考虑将此名称更改为以大写字母开头,拼写为Controller.)
  2. Drag,或者仅将一个“外部对象”从对象库拼写到笔尖中。在身份检查器中,将外部对象的自定义类设置为AnswerButtons.
  3. In

Attributes

  1. ,将其外部对象标识符从应答按钮对象设置为answerButtons.
  2. Control-drag,将按钮连接到相应的插座。

最后,我们需要在加载nib时向nib加载器提供AnswerButtons单例。编辑p3VC.m并为其提供loadView方法:

p3VC.m

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)loadView {
    NSDictionary *externals = [NSDictionary dictionaryWithObject:[AnswerButtons answerButtons]
        forKey:@"answerButtons"];
    NSDictionary *nibOptions = [NSDictionary dictionaryWithObject:externals
        forKey:UINibExternalObjects];
    [self.nibBundle loadNibNamed:self.nibName owner:self options:nibOptions];
    [[AnswerButtons answerButtons] buttonsDidLoad];
}

使用这种方法,您还可以在AnswerButtons类中创建IBAction方法,并使用nib将按钮连接到这些操作。

票数 1
EN

Stack Overflow用户

发布于 2012-02-05 02:29:48

由于UIButton继承自UIControl,因此您可以使用以下方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yourButton1 addTarget:yourObject action:@selector(yourMethod) forControlEvents:UIControlEventTouchUpInside];

把它挂在创建按钮的循环中,你就可以开始工作了。如果要从界面构建器添加按钮,则需要为每个按钮挂接一个IBOutlet。示例:在视图控制器init

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 self.Ans1 = [[UIButton alloc] init];
 [Ans1 setTitle:@"" forState:UIControlStateNormal];
//set the action
    [Ans1 addTarget:self action:@selector(yourMethod) forControlEvents:UIControlEventTouchUpInside];

另一种方法是为每个按钮创建IBAction方法,并将该方法挂接到单例中的方法,在我看来这要清楚得多。

示例:在视图控制器中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(IBAction) button1Press:(id)sender{

[yourSingleton button1Press];

}
票数 1
EN

Stack Overflow用户

发布于 2012-02-05 05:37:20

要将按钮连接到接口构建器,您必须在每个变量声明中的UIButton之前放置"IBOutlet“。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IBOutlet UIButton * Ans1;

然后在界面构建器中,您可以右键单击并从视图控制器拖动到按钮上,然后选择右按钮。然后,如果您想让每个按钮执行一个方法,则应该在.h文件中声明一个IBAction方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(IBAction)doButtonStuff:(id)sender;

然后,要将动作与界面构建器中的每个按钮挂钩,请转到界面构建器,右键单击并从按钮拖动到视图控制器,然后选择要将其关联到的方法。通常使用界面构建器是快速和简单的,但如果你想做一些额外的幕后工作,你可以使用whitelion发布的代码。另外,顺便说一句,为了在设置按钮时使用更少的代码,您可以执行for each循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (UIButton * button in ansButs) {
    self.button = [[UIButton alloc] init];
    [button setTitle:@"" forState:UIControlStateNormal];
}

这是一个很少的代码!您必须在此代码之前声明数组,并包含其中的所有按钮。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9146412

复制
相关文章
sed命令在文本每行,行尾或行首添加字符
用sed命令在行首或行尾添加字符的命令有以下几种: 假设处理的文本为test.file
章工运维
2023/05/19
3.8K0
sed命令在文本每行,行尾或行首添加字符
自动删除vim中行尾空格
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序手艺人
2019/10/22
5K0
sed 删除命令
删除/etc/passwd中的不能登录的用户(筛选条件:/sbin/nologin)
用户1217611
2022/05/06
1.3K0
sed 删除命令
Python从字符串中删除字符
Sometimes we want to remove all occurrences of a character from a string. There are two common ways to achieve this.
全栈程序员站长
2022/09/01
5.8K0
Qt之去除指定行首/行尾字符(串)
3. 通过对比我们可以看到使用正则表达式会比使用left(right)与remove的形式慢,主要的原因是正则表达式需要解析表达式自身的原因。
Qt君
2019/07/15
4K0
(30)字符截取命令sed
sed是一种几乎包括在所有UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
生信real
2020/09/02
1.5K0
Linux中sed工具的使用
sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
谢公子
2022/01/19
2.3K0
Linux中sed工具的使用
如何从 Python 中的字符串列表中删除特殊字符?
在进行字符串处理和文本分析时,有时我们需要从字符串列表中删除特殊字符。特殊字符可能是空格、标点符号、换行符等,在某些情况下它们可能干扰我们的文本处理或分析任务。Python 提供了多种方法来删除字符串列表中的特殊字符。本文将详细介绍在 Python 中删除字符串列表中特殊字符的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/01
8.3K0
awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门
三剑客 linux下的文本三剑客 grep egrep,grep,fgrep 文本查找的需要 grep:根据模式搜索文本,并将符合模式的文本行显示出来。 pattern:文本符和正则表达式的元字符组合而成的匹配条件 grep [option] "pattern" file grep root /etc/passwd -i:忽略大小写 --color:匹配的字符高亮显示 alias alias grep='grep --color' -v:反向查找 -o:只显示被模式匹配的字符串(不显示行
若与
2018/04/25
1.3K0
awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门
linux工具——vim文本编辑器整理
vim是一个文本编辑神器, 长时间没用生疏了,这篇文章整理了一下vim常用操作和快捷键
数据仓库践行者
2022/03/15
1.1K0
linux工具——vim文本编辑器整理
Linux中sed命令简单介绍
说到sed命令,就不得不sed,awk,grep三个命令,很多时候这三个命令是一同出现的;
似水流年o
2022/05/03
1.9K0
sed 命令+正则表达式
sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑小或大的文件,有许多 sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节省了时间。sed必须通过行号和正则表达式指定要改变的文本行
一见
2018/08/07
3.4K0
LINUX运维常用命令详解一
1、ls     文件属性:          -:普通文件          d:目录文件          b:块设备          c:字符设备文件          l:符号连接文件          p:命令管道          s:套接字文件      文件权限:          9位数字,每3位一组          文件硬链接次数          文件所属主(owner)          文件的属组(group)          文件大小(size),单位默认是字节      ls常用选项:          -l:显示文件属性,ls -l=ll          -h:做相应的单位转换显示          -a:显示所有文件          -A:显示.和..以为的所有文件          -d:显示目录自身属性          -i:显示文件的缩影接点号码(index node ,inode)          -r:逆序显示文件列表          -R:递归显示文件  2、cd     cd:change directory      cd:回到用户的家目录      cd ~username:进入指定用户的家目录      cd - :在当前目录和前一次所在的目录来回切换      cd ..:切换至其父目录  3、printenv:显示当前环境变量信息
菲宇
2022/12/02
9030
删除重复字符
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
1.7K0
干货!上古神器 sed 教程详解,小白也能看的懂
熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep、awk、sed,我们今天要聊的主角就是 sed。
用户3105362
2021/02/04
2.5K0
干货!上古神器 sed 教程详解,小白也能看的懂
详解流编辑器 sed 和 编程语言 awk
本文介绍了如何使用流编辑器sed和编程语言awk对文本进行编辑和处理。首先介绍了流编辑器sed,它是一种非交互式编辑器,可以用于删除、替换和插入文本。然后介绍了编程语言awk,它是一种功能强大的文本处理工具,可以用于各种文本处理任务,包括从文本中提取信息、过滤和转换文本以及处理文本数据。
s1mba
2017/12/28
1.2K0
详解流编辑器 sed 和 编程语言 awk
Vim常用快捷键
本文介绍了Vim常用快捷键,包括移动光标、删除、复制粘贴、撤销和查找等操作。
GavinZhou
2018/01/02
1.2K0
Linux:sed命令详解
1. 简介 sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。 sed 编辑器逐行处理文件(或输入),并将结果发送到屏幕。具
张戈
2018/03/23
7.1K0
Linux:sed命令详解
python 删除字符
s = '\tabc\t123\tisk' print(s.replace('\t', ''))
用户5760343
2019/07/24
1.6K0
Shell四剑客实操案例
在Shell编程工具中,四剑客工具的使用更加的广泛,Shell编程四剑客包括:find、sed、grep、awk,熟练掌握四剑客会对Shell编程能力极大的提升。
胡齐
2019/09/23
2.1K0

相似问题

使用UL时避免换行符

43

使用jquery append()或html()时避免换行

20

避免换行

23

Eclipse避免使用jmockit换行

11

避免使用AppleScript进行换行

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文