Променете избрания сегмент на UISegmentedControl

Имам UISegmentedControl в моя ModeViewController

ModeViewController.h:

@property (weak, nonatomic) IBOutlet UISegmentedControl *Segment;
- (IBAction)switchMode:(id)sender;

ModeViewController.m:

- (IBAction)switchMode:(id)sender {
    //I Tried this way    
    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    _Segment.selectedSegmentIndex = segmentedControl.selectedSegmentIndex;


//or this way
NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;
[_Segment setSelectedSegmentIndex:selectedSegment];

}

Но веднага щом сменя на ViewController и се върна, ще се покаже само избраният по подразбиране сегмент! Някаква идея?


person user1354743    schedule 15.02.2013    source източник
comment
Това свойство трябва да бъде strong.   -  person    schedule 15.02.2013
comment
Той използва IBOutlet, weak е добре   -  person Daniel    schedule 15.02.2013


Отговори (3)


След като промените контролера на изгледа и се върнете, методът viewDidLoad се извика отново, затова виждате избрания по подразбиране индекс. Начинът да се преодолее това е да съхраните избрания избран индекс в някакво свойство на делегат на приложение или можете да създадете единичен клас за по-добър дизайн, за да запазите състоянието. И във вашия изгледDidLoadMethod.

-viewDidLoad
{
  AppDelegate *delegate=[[UIApplication sharedAppliection]delegate];
  [_Segment setSelectedSegmentIndex:delegate.selectedIndex];
}

Това ще ви свърши работа.

person V-Xtreme    schedule 15.02.2013
comment
Имам NSInteger в моя AppDelegate и запазвам индекса в него! всеки път, когато влизам в ViewDidLoad, задавам избрания сегмент - person user1354743; 15.02.2013

Проблем

Проблемът тук е, че когато Viewcontroller е представен модално, свойствата вътре в него имат само живота, докато не бъде отхвърлен.

Проверете кода си, ще има екземпляр на контролера на изгледа, който ви дава нов екземпляр и в този нов екземпляр ще се покаже контролът на сегмента от зададената стойност на перото (или каквото сте задали в viewDidload или ViewWillAppear методи

Решение

Решението е да съхраните стойността някъде, където е възможно да я извлечете и зададете във viewDelegates като

  [self.segment setSelectedSegmentIndex:storedIndex];

За тази цел на съхранение има различни варианти

  1. Глобална променлива в appDelegate
  2. NSUserDefaults
  3. CoreData
  4. Sqlite
  5. Plist
  6. Текстов файл

Най-лесният е първият, но ако прилагате нещо от това вече има поле за това е значителна опция

Приятно кодиране :)

person Lithu T.V    schedule 15.02.2013

Трябва да направите тази променлива selectedSegment глобална в приложението си. можете да го дефинирате в AppDelegate

iPhone, как да I Променлива за делегат на приложение, която може да се използва като глобални променливи?

person Baby Groot    schedule 15.02.2013