WedX - журнал о программировании и компьютерных науках

Цель C IOS prepareForSegue, как мне получить переменную int, которую я назначил кнопке для следующего контроллера представления

Итак, у меня есть представление коллекции, которое динамически генерирует набор кнопок с использованием основных данных. Я завершил ту часть, где я назначил кнопки и значения для кнопок.

    - (UICollectionViewCell *)collectionView:(UICollectionView   *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *identifier = @"Cell";

        [self.collectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:identifier];

        CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

        [cell.myButton addTarget:self
                          action:@selector(collectionViewButtonPressed:)
                forControlEvents:UIControlEventTouchUpInside];

        UIImage *btnImage;

        btnImage = [UIImage imageNamed:[sportButtons objectAtIndex:indexPath.row]];

        NSNumber *sportsValue;

        sportsValue =[NSNumber numberWithInt:(int)[sportsNumber objectAtIndex:indexPath.row]];


        [cell.myButton setBackgroundImage:btnImage forState:UIControlStateNormal];

        return cell;
    }

Так что это работает нормально

Теперь это код выполнения Segue

- (void)collectionViewButtonPressed:(UIButton *)sender {

    [self performSegueWithIdentifier:@"venues" sender:self];
}

Теперь этот код здесь, так как я могу получить это sportsValue в ячейке/кнопке, чтобы передать его следующему контроллеру представления, чтобы я мог использовать его как переменную

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"venues"]) {

    //so how do I get that sportsValue in the cell/button to pass it onto to the next view controller so I can use it as a variable   

    }
}
10.06.2016

  • вы можете установить значение тега myButton с вашим sportsValue в cellForItemAtIndexPath, чем получить и удерживать это значение тега в collectionViewButtonPressed в переменной через sender.tag и отправить это значение следующему ViewController 10.06.2016
  • могу я получить краткий пример? 10.06.2016

Ответы:


1

Вот пример того, как вы можете получить это sportsValue в collectionViewButtonPressed и перейти к nextVC-

In FirstViewController.m class-

#import "YourNextVIewController.h"

@interface FirstViewController (){
    NSNumber *passSportsValue;  // this will hold your sports value when button pressed.
}
@end

- (UICollectionViewCell *)collectionView:(UICollectionView   *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *identifier = @"Cell";

    [self.collectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:identifier];

    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    [cell.myButton addTarget:self
                      action:@selector(collectionViewButtonPressed:)
            forControlEvents:UIControlEventTouchUpInside];

    UIImage *btnImage;

    btnImage = [UIImage imageNamed:[sportButtons objectAtIndex:indexPath.row]];

    NSInteger sportsValue;

    sportsValue =[[sportsNumber objectAtIndex:indexPath.row]integerValue];

    [cell.myButton setBackgroundImage:btnImage forState:UIControlStateNormal];

    cell.myButton.tag= sportsValue; // or cell.myButton.tag=indexPath.row; No need to get sportsValue in this method

    // you can also use cell.myButton.superview.tag property to pass your sportsValue, if you don't want to use myButton.tag property

    return cell;
}
- (void)collectionViewButtonPressed:(UIButton *)sender {

    passSportsValue = [NSNumber numberWithInteger:sender.tag]; // i.e. your sportsValue

    /* if you are using indexPath.row i.e. cell.myButton.tag = indexPath.row;

     passSportsValue = [NSNumber numberWithInteger:[[sportsNumber objectAtIndex:sender.tag]integerValue]];

     */

    [self performSegueWithIdentifier:@"venue" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"venue"]) {
        YourNextVIewController *nextVC = [segue destinationViewController];
        nextVC.passNumber = passSportsValue;
    }
}

В YourNextVIewController.h class добавьте эту строку

@property (strong, nonatomic) NSNumber *passNumber;

Теперь вы можете проверить passSportsValue в YourNextVIewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
     NSLog(@"%d",[self.passNumber integerValue]);
}

Надеюсь, это решит вашу проблему.

10.06.2016
  • Это решило мою проблему, именно то, что мне было нужно. Однако мне нужно было использовать cell.myButton.tag=indexPath.row; в противном случае значение passSportsNumber всегда остается равным 1. 10.06.2016

  • 2

    Сначала установите свойство tag для каждой кнопки, равное требуемому index, а затем в методе selector вы можете получить это index

    - (void)collectionViewButtonPressed:(UIButton *)sender {
        NSInteger index = sender.tag;
       [self performSegueWithIdentifier:@"venues" sender:index];
    }
    
    10.06.2016
  • Вы не можете использовать NSInteger в качестве отправителя, так как это не объект. Лучше отправить кнопку как отправителя и извлечь значение тега в prepareForSegue 10.06.2016

  • 3

    Пожалуйста, это только логика:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"venues"]) {
            UIViewController *zoomVC = segue.destinationViewController;
    
            UICollectionViewCell *cell = (UICollectionViewCell *)
                                [self superviewWithClassName:@"UICollectionViewCell"
                                fromView:button];
            NSIndexPath *indexPath;
            if (cell)
            {
                 indexPath = [self.collectionView indexPathForCell:cell];
               // do whatever action you need with the indexPath...
            }
           //            or
            //            NSIndexPath *indexPath = [collectionview indexPathsForSelectedItems];
            zoomVC.strId = indexPath.item;//indexPath.row;
        }
    }
    

    И вы являетесь событием кнопки вызова, которое создает одну общую переменную для совместного использования:

    @interface WebViewVC (){
         int index;  // you declare interface
    }
    @end
    
    - (void)collectionViewButtonPressed:(UIButton *)sender {
         index = sender.tag;
         [self performSegueWithIdentifier:@"venues" sender:self];
    }
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"venues"]) {
            UIViewController *zoomVC = segue.destinationViewController;
            zoomVC.strId = index;
        }
    }
    
    10.06.2016
  • NSIndexPath *indexPath = [коллекция indexPathsForSelectedItems]; не работает и какой тип индекса? Спасибо. 10.06.2016
  • Извините, это не работает, zoomVC.id = index; выдает ошибку о том, что идентификатор свойства не найден в UIViewcontroller 10.06.2016
  • id означает создание другого объекта. ваш второй контроллер представления создает один объект после того, как этот объект использует идентификатор. 10.06.2016

  • 4

    В вашем случае, если бы вы создали новый класс, производный от UIButton, с вашим собственным новым пользовательским тегом для хранения данных во время создания ячейки таблицы. В то время как «performsegue» можно получить эти данные для вашего использования. Я бы не стал использовать обычное свойство тега, потому что оно имеет собственное использование в пользовательском интерфейсе uitablecell.

    10.06.2016
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]