Передача NSString между классами

Так что я немного запутался при передаче NSString в класс. У меня есть класс легенды, который рисует маленькую коробку и имеет метку, что это за коробка. Моя коробка по сути является объектом UIView, в котором я меняю цвет фона. В моем методе инициализации я инициализирую поле, а затем в другом своем классе, где я создаю экземпляр этого класса, я устанавливаю цвет фона. Однако в случае NSString я не знаю, как выделить/инициализировать и установить его текст из другого класса. Вот мой код для легенды.

- (id)sharedInit {
    self.backgroundColor = [UIColor clearColor];

    self.LegendBox = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height / 2 - LEGEND_SIZE / 2, LEGEND_SIZE, LEGEND_SIZE)]; // hugs LHS, centered vertically

    self.LegendLabel = [[NSString alloc] init];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 0, self.bounds.size.width - 25, self.bounds.size.height)]; 
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];
    label.text = self.LegendLabel;
    label.font = [UIFont fontWithName:@"Arial" size:14.0];
    label.numberOfLines = 5;
    label.lineBreakMode = UILineBreakModeWordWrap;

    [self addSubview:label];
    [self addSubview:_legendBox];

    return self;
}

Затем, когда я пытаюсь создать экземпляр класса легенды в моем другом классе:

PieChartLabelView *labelView1 = [[PieChartLabelView alloc] initWithFrame:CGRectMake(0, 0, 140, 80)];
labelView1.LegendBox.backgroundColor = BLUE_COLOR;
NSString *str1 = [[NSString alloc] initWithFormat:@"as;flkasjdf;laksjdf"];
labelView1.LegendLabel = str1;

[self addSubview:labelView1];
 [str1 release];
[labelView1 release];

Я не получаю текст для своей метки.

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

[self addSubview:_legendLabel];

против self.LegendLabel? Я до сих пор не понимаю этого до конца. Спасибо.


person Crystal    schedule 29.06.2011    source источник


Ответы (2)


Вторая часть

Чтобы сначала ответить на ваш второй вопрос, выполните либо

[self addSubview:_legendLabel];

or

[self addSubview:self.legendLabel];

должно быть таким же, если вы не выполняете ленивое создание экземпляров. Метод getter в большинстве случаев извлекает значение, поэтому вы должны хорошо применять первый подход. Но если вы выполняете какое-либо ленивое создание экземпляров, определяя свой собственный метод получения, где вы делаете что-то вроде этого,

- (UILabel *)legendLabel {
    if ( !_legendLabel ) {
        // Instantiate _legendLabel
    }

    return _legendLabel;
}

тогда это будет иметь другое значение, если вы не сделаете self.legendLabel.

Первая часть

Именно здесь ваш второй вопрос добавляет немного путаницы, вы, кажется, ссылаетесь на LegendLabel как на переменную NSString, когда пытаетесь добавить ее в качестве подпредставления во втором вопросе.

Впрочем, ты, кажется, этого и ждешь —

labelView1.LegendLabel = str1;

изменить текст метки, потому что вы делаете это в методе sharedInit

label.text = self.LegendLabel;

Это не повлияет на текст этикетки по двум причинам:

  1. Если и свойство text метки, и LegendLabel должны указывать на один и тот же объект, то вам потребуется, чтобы объект был изменяемым, чтобы изменения отражались на метке. Если вы переназначите LegendLabel, то оба они будут указывать на два разных объекта.
  2. В большинстве случаев свойства NSString объявляются как свойства copy для защиты от изменчивости. Таким образом, вы не можете изменить текст метки, даже если LegendLabel можно изменить.

Это означает, что вам нужно будет сделать метку переменной экземпляра или свойством, чтобы иметь прямой доступ к метке и обновить ее свойство text, или переписать метод установки LegendLabel для обновления метки.

Однако я думаю, что объявление метки как свойства — это правильный подход, а название LegendLabel немного сбивает с толку. Было бы лучше, если бы это была этикетка.

person Deepak Danduprolu    schedule 29.06.2011

Когда вы создаете NSString, вы должны делать это прямо так:

NSString *str1 = @"ñalskdfjsdañlkfj";

Если вы хотите использовать формат, вы делаете это следующим образом:

NSString *str2 = [NSString stringWithFormat:@"This is string %d", 2];

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

@property (copy) NSString *str3;
person jglievano    schedule 29.06.2011