ios按下按钮按下按钮

时间:2013-11-13 22:19:32

标签: ios uibutton subclass

首先,我是ios开发的新手,我正在努力了解如何解决这个问题。

这个screengrab来自另一个应用程序。当您按下绿色加号按钮时,它会添加更多按钮,例如顶部的按钮,具体取决于您按绿色加按钮的次数

enter image description here

我试图复制这个,但不知道从哪里开始。我的问题是,最好为顶部按钮创建一个子类吗?然后在每次按下绿色加号按钮时以某种方式附加该子类按钮?

1 个答案:

答案 0 :(得分:1)

我想自己学习,所以我创建了示例项目,这里有一个简单的教程如何完成。不完美,但也许你会了解它的工作原理。


在Interface Builder中创建表视图控制器。然后将按钮和文本字段添加到原型单元格中。

Table view controller and prototype cells


将新类添加到项目中,让我们使用名称MyTableViewController调用它。将Table View Controller的类设置为MyTableViewController(在界面构建器中)。

enter image description here


设置原型单元格的标识符。我使用defaultCell值。

enter image description here


设置按钮和文本字段的标记值。

enter image description here

我使用了这些标记值:

  • 加号按钮:100
  • 时间按钮:110
  • 项目按钮:120
  • 文字字段1:10
  • 文字字段2:20
  • 文字字段3:30

MyTableViewController.h(注意: UITableView链接为tView变量)

#import <UIKit/UIKit.h>

@interface MyTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate>

/* Data array */
@property (nonatomic) NSMutableArray *data;
/* Expanded cell */
@property (nonatomic) NSInteger expandedCell;

/* Table view */
@property (strong, nonatomic) IBOutlet UITableView *tView;

@end 

MyTableViewController.m

#import "MyTableViewController.h"

@interface MyTableViewController ()

@end

@implementation MyTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    /* No cells expanded by default */
    _expandedCell = -1;

    /* Create data array */
    _data = [NSMutableArray new];

    /* Add two cells to data array */
    UITableViewCell *cell = [self newDefaultCell:0];
    [_data addObject:cell];
    UITableViewCell *cell2 = [self newDefaultCell:1];
    [_data addObject:cell2];
}

- (UITableViewCell *)newDefaultCell:(NSUInteger)index {

    /* Initialize new UITableViewCell using prototype cell */
    UITableViewCell *cell = [_tView dequeueReusableCellWithIdentifier:@"defaultCell"];

    /* Initialize buttons for this cell */
    UIButton *plusButton = (UIButton *)[cell viewWithTag:100];
    [plusButton setTag:index];
    [plusButton addTarget:self action:@selector(plusButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    UIButton *timeButton = (UIButton *)[cell viewWithTag:110];
    [timeButton setTag:index];
    [timeButton addTarget:self action:@selector(timeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    UIButton *itemButton = (UIButton *)[cell viewWithTag:120];
    [itemButton setTag:index];
    [itemButton addTarget:self action:@selector(itemButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [_data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* Returns UITableViewCell object from data array */
    return [_data objectAtIndex:indexPath.row];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    /* If cell is expanded, return row height 140 */
    if(_expandedCell == indexPath.row) {
        return 140;
    } /* else return row height 30 */
    else return 30;
}

- (void)plusButtonPressed:(id)sender {
    /* Create new UITableViewCell */
    UITableViewCell *newCell = [self newDefaultCell:[_data count]];
    /* Add UITableViewCell to data array */
    [_data addObject:newCell];

    /* Update table view */
    [_tView beginUpdates];
    [_tView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:([_data count]-1)inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
    [_tView endUpdates];
}

- (void)timeButtonPressed:(id)sender {
    UIButton *button = (UIButton*)sender;

    /* Expand this cell to show UITextFields */
    _expandedCell = [button tag];

    /* UITableViewCell from data array, index is button's tag value */
    UITableViewCell *cell = [_data objectAtIndex:[button tag]];

    /* You can access text fields using viewWithTag: call */
    UITextField *tf1 = (UITextField *)[cell viewWithTag:10];
    UITextField *tf2 = (UITextField *)[cell viewWithTag:20];
    UITextField *tf3 = (UITextField *)[cell viewWithTag:30];

    /* Reload UITableViewRow */
    NSArray *indexes = @[[NSIndexPath indexPathForRow:[button tag] inSection:0]];
    [_tView reloadRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationTop];
    [_tView beginUpdates];
    [_tView endUpdates];
}

- (void)itemButtonPressed:(id)sender {

}

@end

已经完成了。