Создавайте Segue или Push для другого контроллера View программно после нажатия кнопки UIButton. - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь понять это в течение некоторого времени. Я создаю UIButton программно в ячейке таблицы. После нажатия на кнопку я хочу перейти или нажать на другой вид контроллера. Это будет очень просто, если я использую StoryBoard, создаю там кнопку, а затем перетаскиваю управляющую подсказку в целевой VC. Однако я не хочу делать это по разным причинам. Ниже приведен мой код.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath



// <<<< bunch of code snipped out here to keep this example short >>>



for(UIButton *button in cell.subviews)
{
    [button removeFromSuperview];
}
UIImage *image = [UIImage imageNamed:[contentArray_ objectAtIndex:indexPath.row]];
UIButton *imageButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, 240, 240)];
[imageButton setImage:image forState:UIControlStateNormal];
imageButton.layer.masksToBounds = YES;
imageButton.layer.cornerRadius = 5.0;
imageButton.layer.borderWidth = 1.0;
imageButton.layer.borderColor = [[UIColor grayColor] CGColor];

CGAffineTransform rotateButton = CGAffineTransformMakeRotation(M_PI_2);
imageButton.transform = rotateButton;

cell.backgroundColor = [UIColor clearColor];
[cell addSubview:imageButton];

return cell;

Теперь для каждой строки в этой таблице кнопка с изображением будет создана программно. Я также поворачиваю кнопку - да, это горизонтальный вид таблицы.

Так как мне действовать при нажатии кнопки? Все кнопки перейдут на один и тот же контроллер вида назначения ...

PS - я использую Xcode 4.2 с ARC (не уверен, что это действительно имеет значение).


----- Обновление вопроса

Я реализовал предложение кода (спасибо jrturton), однако я считаю, что поскольку я нахожусь в ячейке UITableView, я не могу представить контроллер модального представления. Теперь у меня есть следующий код ...

.h файл:

@interface DetailsHorizontalPhotoCell : UITableViewCell <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) IBOutlet UITableView *horizontalTableView;
@property (nonatomic, strong) NSArray *contentArray;

- (IBAction)photoButton:(id)sender;
@end

.m файл:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    /// ----- code here to setup the cell, button, image, etc...

    // do something when the buttong is pressed
    [imageButton addTarget:self action:@selector(photoButton:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (IBAction)photoButton:(id)sender 
{
    CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.horizontalTableView];
    NSIndexPath *hitIndex = [self.horizontalTableView indexPathForRowAtPoint:hitPoint];

    // do some stuff here to pull object data out of the contentArray
    NSLog(@"Image clicked, index: %d", hitIndex.row);
    // other non-relevant code snipped to keep this example short

    // next I want to present a modal view controller (lets call it PhotoAlbum) which is a TableViewController

    PhotoAlbum *photoAlbum = [[PhotoAlbum alloc] init];

    // below does not work, does not even autocomplete in Xcode. I believe its because I'm in a UITableViewCell and not a VC... Any suggestions here?
    [photoAlbum setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
    [self presentModalViewController:photoAlbum animated:YES];
}

1 Ответ

2 голосов
/ 09 февраля 2012

Я не уверен, почему вы каждый раз воссоздаете кнопку в ячейке, а не меняете изображение, но давайте пока проигнорируем это.

Вы можете подключить все свои кнопки к одному действию в контроллере табличного представления, это действие может принимать аргумент sender как обычно.

Вы добавляете действие следующим образом:

[imageButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

Это вызывает метод в вашем контроллере представления с подписью:

 -(void)buttonPressed:(UIButton * sender)

В этом методе вы можете обнаружитькакая строка была нажата следующим образом:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];

А затем выполните любые другие действия, которые вам нравятся.

...