将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C

Posted

技术标签:

【中文标题】将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C【英文标题】:Display each NSString element in an NSArray as a UIButton Objective C 【发布时间】:2018-01-04 02:06:48 【问题描述】:

我正在制作一个读取文本文件的应用程序,将每个换行符拆分为一个 NSArray 元素,然后(希望)在彼此下方显示 UIButtons,其标题是数组元素的名称。

例如,假设文本文件包含以下内容:

Apples
Pears
Bananas
Mangos

然后读取文本文件(我们称之为fruit.txt),并将其放入NSString

NSString *fruit = [[NSString alloc]initWithContentsOfFile:@"/var/mobile/fruit.txt" encoding:NSUTF8StringEncoding error:nil];

然后用换行符分割成NSArray:

NSArray *individualFruit = [fruit componentsSeparatedByString:@"\n"];

所以

individualFruit[0] => Apples
individualFruit[1] => Pears
individualFruit[2] => Bananas
individualFruit[3] => Mangos

但是,通过一些编码魔法(可能使用 for 循环),我们最终会得到这样的结果:

 -------------------
|_______Fruit_______| <- UINavigationBar
|       Apples      | <- UIButton
|___________________|
|       Pears       | <- UIButton
|___________________|
|       Bananas     | <- UIButton
|___________________|
|       Mangos      | <- UIButton
|___________________|
|                   |
|         _         |
|        ( )        |
 -------------------

(请原谅我可怕的 ascii 艺术,它本来是一部 iPhone。)

但是……

如果用户要在文件中添加另一行文本,例如:

Apples
Pears
Bananas
Mangos
Carrot

然后打开应用会创建另一个按钮,如下所示:

 -------------------
|_______Fruit_______| <- UINavigationBar
|       Apples      | <- UIButton
|___________________|
|       Pears       | <- UIButton
|___________________|
|       Bananas     | <- UIButton
|___________________|
|       Mangos      | <- UIButton
|___________________|
|       Carrot      | <- UIButton
|___________________|
|        ( )        |
 -------------------

从文本文件中删除一行将删除相应的按钮。

这可能吗?

【问题讨论】:

没什么,我卡住了 您希望有多少个按钮?如果需要一个小的 ( UITableView 是最好的解决方案。 【参考方案1】:

是的,这是可能的,而且应该很简单——我会使用这种方法:

    将 tableView 添加到 UIViewController

如果元素数量太大,这将允许您使用滚动按钮。这也意味着您可以更改单元格,并且此效果将应用于您的所有按钮。如果您正在考虑手动添加它们,那么不要 - 想象一下如果您的数组中有 1000 个水果 - 如果不滚动,它们将不适合屏幕。

    创建自定义单元格

创建一个自定义单元格并在其中放置一个 UIButton。然后您可以在 cellForRowAtIndex 中初始化按钮以设置按钮的标题

// Swift
let title = individualFruit[indexPath.row] as! String
cell.button.setTitle(title for: .normal)

// Obj-C
NSString * title = individualFruit[indexPath.row];
[cell.button setTitle: title];

如果您不确定是否要创建自定义单元格,请在 *** 上查找 - 这并不难,而且有很多可用资源。

    添加或删除时更新 tableView

为此,您需要确保 numberOfRowsForSection 链接到您的数组:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return individualFruit.count

现在,当您添加和删除时,您只需重新加载 tableView,它就会更新 tableView。

tableView.reloadData()
[tableView reloadData];

如果您希望它看起来稍微好一点,那么可以使用插入和删除单元格 (documentation) 来解决一些功能,但这超出了问题的范围。

    链接按钮

根据您想要访问按钮的方式,您有多种选择。

a) 在您创建的 CustomTableCellClass 中处理它并单击按钮。 b) 将标签添加到 UIButtons(数组中的索引),然后在 cellForRowAtIndex 中添加目标。然后,当您单击按钮时,将调用目标方法,您可以检查发送方上的标签以计算按钮的索引,从而计算数组中的标题。

注意:这又稍微超出了问题的范围,因为它没有被明确提出,但为什么有一个不会被按下的按钮。

这个功能都使用了非常基本和核心的 ios 功能。我编写的代码都是 sudo 代码,不应该复制粘贴 - 相反,您应该阅读并理解这些概念,然后自己构建功能。如果您有不确定性,我很乐意编辑答案以使其更清楚。

【讨论】:

以上是关于将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C的主要内容,如果未能解决你的问题,请参考以下文章

将 NSNumber* 的 NSArray 存储为 Core Data 中的 NSString

如何将变量与 NSArray 中的 NSDictionary 中的对象进行比较?

如何将 NSArray 元素加入 NSString?

iPhone SDK 中的 NSMutableArray、NSArray、NSString 内存泄漏

将 NSString 转换为字符的 NSArray [重复]

NSArray 作为核心数据 fetchRequest 中的参数