Objective C доступа к переменным из других классов? - PullRequest
1 голос
/ 01 марта 2012

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

Файл таблицы. Класс .h:

@property(nonatomic) NSInteger itemId;
-(NSInteger)itemId;

Я бы тогдасоздать методы, которые устанавливают и получают переменную в файле .m класса Table View (я синтезировал и сделал все это, я просто показываю вам методы)

-(NSInteger)itemId {
return self.itemId;
}

А теперь таблицаметод выбранной ячейки ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)
indexPath {
NSUInteger row = [indexPath row];
self.itemId = row;
//segue stuff (if you want me to include this just let me know)
}

Вот и все для этого класса, а теперь и того класса, который мне нужен для значения View Controller Class .h, который проталкивается с помощью segue

@property (nonatomic) NSInteger itemId;

View Controller Class .m

#import "TableViewController.h"
//Skip a few things
@synthesize itemId;
//skip a few things
-(void)viewDidLoad {
TableViewController *tvc = [[TableViewController alloc] init];
itemId = [tvc itemId];
NSLog(@"%i", itemId);

По некоторым причинам это не работает ... Когда я распечатываю "itemId" в методе "didselectrow", он возвращает правильное число, но когда я пытаюсь напечататьэто в другом классе, это просто дает мне «0» Есть мысли?Если есть что-то, что я хотел бы увидеть в моем коде, я был бы очень рад написать это :) Я просто хотел сэкономить время и пространство, немного урезав код.Заранее спасибо!

РЕДАКТИРОВАТЬ: Я нашел возможное решение, но оно предполагает использование делегата.Я уверен, что должен быть лучший способ сделать это, так что если у вас есть какие-либо идеи, просто дайте мне знать.

Ответы [ 6 ]

2 голосов
/ 01 марта 2012
TableViewController *tvc = [[TableViewController alloc] init]; 

Делая это в другом классе, вы создаете и инициализируете новый объект, поэтому он будет нулевым (для int 0). Для обмена данными между классами и контроллерами представления используйте делегаты и свойства. С небольшим кодом я объясню;

#import <UIKit/UIKit.h>

    //YourClassNameAppDelegate.m
    @interface YourClassName : UIResponder <UIApplicationDelegate>
    {
        NSString *uName;
        NSDictionary *YourDictionary;
    }

    @property (copy, readwrite) NSString *uName;
    @property (copy, readwrite) NSString *YourDictionary;

And in the other class you want to use this string and dictionary,

    //import your delegate class
    #import "YourClassNameAppDelegate"
    .
    .
    .
    //to me, do this in viewDidLoad(or something like that) method of new view controller
    YourClassNameAppDelegate *sharedData= (YourClassNameAppDelegate *)([[UIApplication sharedApplication]delegate]);
    .
    .
    -(IBAction)sharedData{
       NSLog(@"Shared String: %@\n And Shared Dictionary: %@, sharedData.uName, sharedData.YourDictionary);

    }
0 голосов
/ 01 марта 2012

Я предлагаю сохранить indexPath для нажатой строки в одиночном коде.Вот руководство по использованию одноэлементного класса для хранения объектов и их использования в разных классах.

В этом примере вы также можете просто объявить переменную экземпляра в синглтоне и установить ее, когдастрока нажата в соответствующем методе делегата для вашего UITableView .Это можно сделать так:

#import <Foundation/Foundation.h>
@interface Singleton : NSObject {

NSIndexPath *tableViewPath;

}

#import "DataContainerSingleton.h"
@implementation DataContainerSingleton

@synthesize tableViewPath;

static DataContainerSingleton* _theDataContainerSingleton = nil;

+ (DataContainerSingleton*) theDataContainerSingleton;
{
  if (!_theDataContainerSingleton)
    _theDataContainerSingleton = [[DataContainerSingleton alloc] init];
  return _theDataContainerSingleton;
}

- (id)init
{
    self = [super init];
    if (self) {

            tableViewPath = [NSIndexPath indexPathForRow:0 inSection:0];
    }

    return self;
}

В вашем контроллере вида с UITableView просто сделайте так:

@implementation

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

tableViewPath = indexPath;

}

Вы должны настроитьинициализация в соответствии с вашей конкретной программой!

0 голосов
/ 01 марта 2012

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

Просто создайте свойство на вашем контроллере push-представления, которое содержит любую подробную информацию, которую вы хотите передать. Затем установите это в prepareForSegue: в вашем контроллере табличного представления, где segue.destinationViewController даст вам указатель на VC, который должен появиться.

Также исправьте метод доступа, предложенный Yuji в комментариях.

0 голосов
/ 01 марта 2012

этот код может вам помочь.

#import <UIKit/UIKit.h>

extern int outsider;

@interface ViewController : UIViewController {

}

@property int outsider;

@end

ко всем файлам .m, к которым вы можете импортировать файл .h, в который вы объявили переменную.

0 голосов
/ 01 марта 2012

Попробуйте это:

@property  NSInteger itemId;

Надеюсь, это поможет вам

0 голосов
/ 01 марта 2012

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) не вызывается - вы должны выбрать строку, чтобы изменить значение itemId, и это невозможно между инициализацией таблицы и строкой itemId = [tvc itemId];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...