使用分页从 NSArray 创建多个 UIButton

Posted

技术标签:

【中文标题】使用分页从 NSArray 创建多个 UIButton【英文标题】:Create Multiple UIButtons from NSArray with Pagination 【发布时间】:2012-08-07 02:54:47 【问题描述】:

我正在尝试创建一个 iPhone 应用程序,为 NSArray 中的每个项目创建一个 UIButton。所以基本上,如果数组中有 20 个项目,则会创建 20 个 UIButton,每个按钮都有一个标识符,该标识符以某种方式将其连接到数组中的相应项目。如果我要向数组中添加另一个项目,将创建 21 个按钮而不是 20 个。有没有办法使用 Storyboards 和 Interface Builder 来做到这一点?

另外,有没有办法对创建的 UIButtons 进行分页?我想在一个屏幕上有六个按钮,可以选择滚动到下一个 6。因此,如果数组中有 20 个项目,它将创建一个 ScrollView,前 3 页有 6 个,最后一页有 2 个。

提前致谢!出于视觉原因,我试图避免使用 TableView。如果有更简单的方法可以做到这一点,请告诉我!

【问题讨论】:

【参考方案1】:

在我看来,使用 InterfaceBuilder 并不容易。您最好使用代码创建它们。对于分页,您必须使用分页 UIScrollView。

#define BUTTON_WIDTH 40
#define BUTTON_HEIGHT 30
#define BUTTON_PADDING 10
#define BUTTONS_PER_PAGE 6
#define PAGE_WIDTH ((BUTTON_WIDTH + BUTTON_PADDING) * BUTTONS_PER_PAGE)
#define MAGIC_BUTTON_TAG_OFFSET 6238 /* Maybe somebody already uses views with tags like 0, 1, 2, 3...)

// in an init... method:

UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
sv.contentSize = CGSizeMake(PAGE_WIDTH, sv.frame.size.height);
sv.pagingEnabled = YES;
[self.view addSubview:sv]; // assuming a view controller

NSArray *a = [NSArray arrayWithObjects:...]; // whatever

for (int i = 0; i < a.count; i++)

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(i * (BUTTON_WIDTH + BUTTON_PADDING), 0, BUTTON_WIDTH, BUTTON_HEIGHT);
    btn.tag = i + MAGIC_BUTTON_TAG_OFFSET; // to relate to the array index
    [btn setTitle:[NSString stringWithFormat:@"Button No. %d", i] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [sv addSubview:btn];


- (void)buttonPressed:(UIButton *)btn

    int index = btn.tag - MAGIC_BUTTON_TAG_OFFSET;
    id object = [a objectAtIndex:index];

    [self doSomethingWithObject:object];

希望这会有所帮助。

【讨论】:

以上是关于使用分页从 NSArray 创建多个 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

jQuery DataTables 是在单个请求中还是使用分页从数据库中获取所有数据?

Codeigniter 分页从不同页面和不同员工的不同活动链接开始,而代码相同

将分页从“react-js-pagination”转换为“react-bootstrap”分页

当页面为 1 时,Material-UI Datagrid 分页从第二页开始

Laravel AJAX 分页从旧数据中提取行

Codeigniter分页从不同页面和不同员工的不同活动链接开始,而代码相同