将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C
Display each NSString element in an NSArray as a UIButton Objective C
我正在制作一个读取文本文件的应用程序,将每个换行符拆分为一个 NSArray
元素,然后(希望)在彼此下方显示 UIButton
s,其标题是数组元素。
例如,假设文本文件包含以下内容:
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
|___________________|
| ( ) |
-------------------
从文本文件中删除一行将删除相应的按钮。
这可能吗?
是的,这是可能的,而且应该很简单 - 我会使用这种方法:
- 将 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];
如果您不确定是否要创建自定义单元格,请在 Whosebug 上查找 - 这并不难,而且有很多可用资源。
- 添加或删除时更新 tableView
为此,您需要确保 numberOfRowsForSection 链接到您的数组:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return individualFruit.count
}
现在,当您添加和删除时,您只需重新加载 tableView 即可更新 tableView。
tableView.reloadData()
[tableView reloadData];
如果您希望它看起来稍微好一点,那么可以使用插入和删除单元格 (documentation) 来实现一些功能,但这超出了问题的范围。
- Link 向上按钮
根据您想要访问按钮的方式,您有多种选择。
a) 在您创建的 CustomTableCellClass 中处理它并单击按钮操作。
b) 向 UIButtons 添加一个标签(数组中的索引),然后在 cellForRowAtIndex 中添加一个目标。然后当你点击一个按钮时,目标方法将被调用,你可以检查发送者上的标签来计算按钮的索引,从而计算数组中的标题。
注意:这又稍微超出了问题的范围,因为它没有被明确询问,但为什么有一个不会被按下的按钮。
此功能全部使用非常基本和核心的 iOS 功能。我写的代码都是 sudo 代码,不应该是 copy-pasted - 相反,你应该阅读并理解这些概念,然后自己构建功能。如果您不确定,我很乐意编辑答案以使其更清楚。
我正在制作一个读取文本文件的应用程序,将每个换行符拆分为一个 NSArray
元素,然后(希望)在彼此下方显示 UIButton
s,其标题是数组元素。
例如,假设文本文件包含以下内容:
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
|___________________|
| ( ) |
-------------------
从文本文件中删除一行将删除相应的按钮。
这可能吗?
是的,这是可能的,而且应该很简单 - 我会使用这种方法:
- 将 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];
如果您不确定是否要创建自定义单元格,请在 Whosebug 上查找 - 这并不难,而且有很多可用资源。
- 添加或删除时更新 tableView
为此,您需要确保 numberOfRowsForSection 链接到您的数组:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return individualFruit.count
}
现在,当您添加和删除时,您只需重新加载 tableView 即可更新 tableView。
tableView.reloadData()
[tableView reloadData];
如果您希望它看起来稍微好一点,那么可以使用插入和删除单元格 (documentation) 来实现一些功能,但这超出了问题的范围。
- Link 向上按钮
根据您想要访问按钮的方式,您有多种选择。
a) 在您创建的 CustomTableCellClass 中处理它并单击按钮操作。 b) 向 UIButtons 添加一个标签(数组中的索引),然后在 cellForRowAtIndex 中添加一个目标。然后当你点击一个按钮时,目标方法将被调用,你可以检查发送者上的标签来计算按钮的索引,从而计算数组中的标题。
注意:这又稍微超出了问题的范围,因为它没有被明确询问,但为什么有一个不会被按下的按钮。
此功能全部使用非常基本和核心的 iOS 功能。我写的代码都是 sudo 代码,不应该是 copy-pasted - 相反,你应该阅读并理解这些概念,然后自己构建功能。如果您不确定,我很乐意编辑答案以使其更清楚。