【问题标题】:segmentedControl and TextView refresh/reload - xcodesegmentedControl 和 TextView 刷新/重新加载 - xcode
【发布时间】:2012-08-12 10:00:51
【问题描述】:

我有以下代码,它是用于语言选择选项的分段控件。案例 0 用于英语,案例 1 用于希腊语,然后将其传递给 UITextView。问题是,每次我按下案例 1 或 0 的按钮时,我都必须返回上一个视图控制器,它是一个表格视图控制器,然后返回到“detailViewController”以显示正确的语言。有没有办法做到这一点而无需在视图控制器之间来回切换?类似于UITextView 的小动画或刷新或重新加载方法。

 int a;

- (IBAction)languageSeg:(id)sender {

switch (((UISegmentedControl *)sender).selectedSegmentIndex) {

 case 0:

 a=0;

        break;

    case 1:
        a=1;

        break;

    default:

        break;
}
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}


-(void) viewWillAppear:(BOOL)animated{

[super viewWillAppear:YES];


UIImage *saladImage = [UIImage imageNamed:@"salad.jpg"];

UIImage *fishImage = [UIImage imageNamed:@"fish.jpg"];

 [textDetail setScrollEnabled:YES];

 [textDetail setContentSize:CGSizeMake(320, 190)];


//Switch the UIImages and UILabel based on item



switch (itemNumber) {
    case 0:
        itemName.text = @"Salad";
        itemPic.image = saladImage;
        self.title = @"Salads";

        if (a==0){

            textDetail.text = @"description in english";

        }

        if (a==1){

            textDetail.text = @"description in greek";
        }

        break;


      case 1:

       // etc.

【问题讨论】:

    标签: objective-c ios uitextview selection uisegmentedcontrol


    【解决方案1】:

    您可以在 languageSeg: 方法中更新 textView 的文本,方法与您最初在 viewWillAppear 中设置的方式相同:

    我会创建一个单独的方法来处理语言切换,然后从 viewWillAppear 和 languageSeg 以及您需要的任何其他地方调用该方法。

    例如,您的语言设置方法将包含当前位于 viewWillAppear 底部的代码:

    - (void) languageSetter {
    
        switch (itemNumber) {
           case 0:
                itemName.text = @"Salad";
                itemPic.image = saladImage;
                self.title = @"Salads";
    
                if (a==0){
                    textDetail.text = @"description in english";
                }
                if (a==1){
                   textDetail.text = @"description in greek";
                }
          break;
    
          case 1:
            // etc.
          break;
    
          default:
          // default case
          break;
        }
    }
    

    那么您的 viewWillAppear: 方法将如下所示:

    -(void) viewWillAppear:(BOOL)animated{
    
         [super viewWillAppear:YES];
         UIImage *saladImage = [UIImage imageNamed:@"salad.jpg"];
         UIImage *fishImage = [UIImage imageNamed:@"fish.jpg"];
    
         [textDetail setScrollEnabled:YES];
         [textDetail setContentSize:CGSizeMake(320, 190)];
    
         [self languageSetter];
    }
    

    您的 languageSeg: 方法如下所示:

    - (IBAction)languageSeg:(id)sender {
    
        switch (((UISegmentedControl *)sender).selectedSegmentIndex) {
    
           case 0:
               a=0;
               break;
    
           case 1:
               a=1;
               break;
    
           default:
               break;
        }
    
        [self languageSetter];
    }
    

    很多实现将取决于您的其余代码的设置方式和您的个人需求,但这是大体思路。

    【讨论】:

    • 完美!谢谢!!它可以工作,尽管我不得不将 uiimage 传输回 -(void)languageSetter 因为它未被识别.. 当我返回表格视图并返回 viewController 时,分段控件不会“记住”我之前的选择但是文本已经切换到那个。例如,当我同时按下希腊语时(希腊语描述和希腊语按钮都“打开”)。但是当我来回走动时,按钮以英语突出显示,文本是希腊语..我如何让分段控制记住我的选择?再次感谢!
    • 很高兴我能帮上忙!请有机会时将答案标记为正确。为使分段控件正确显示,可以通过NSUserDefaults跟踪用户的选择,也可以在viewWillAppear:中查看textDetail中有哪些文本,然后适当设置分段控件索引。
    【解决方案2】:

    我有一个带有语言选择器的应用程序,并且我使用 NSUserDefaults。奇迹般有效。 在带有选择器的视图控制器中:

    - (IBAction)languageSeg:(id)sender {
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    switch (((UISegmentedControl *)sender).selectedSegmentIndex) {
    
        case 0:
    
           [defaults setInteger:0 forKey:@"language"];
            break;
    
        case 1:
    
            [defaults setInteger:1 forKey:@"language"];
            break;
    
        default:
    
            break;
    }
    }
    

    并且在 viewController 中的 vieWillAppear 中显示语言:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
        if ([defaults integerForKey:@"language"] == 0) {
            textDetail.text = @"description in english";
    
        }else{
            textDetail.text = @"description in greek";
        }
    

    现在,在viewDidLoad 方法中,如果用户还没有设置值,您需要给它一个默认值,如下所示:(再次在您的视图控制器中显示设置,而不是选择器视图。)

     if (![defaults integerForKey:@"language"]) {
            [defaults setInteger:0 forKey:@"language"];
        }
    
    textDetail.text = @"description in english";
    

    【讨论】:

    • 还是一样.. 我必须返回表格视图并选择单元格才能设置语言。我的问题不是它没有改变,而是它不必来回去找控制者看看效果..谢谢
    【解决方案3】:

    switch (itemNumber) 在哪里被调用?

    如果它在viewDidLoadviewWillAppear等方法中,它只会在这个视图出现时被调用。

    您可能需要将这部分提取为方法,并将其放入(IBAction)languageSeg:(id)sender。例如:

    - (void)updateView
    {
        switch (itemNumber) {
        case 0:
        itemName.text = @"Salad";
        itemPic.image = saladImage;
        self.title = @"Salads";
    
        if (a==0){
    
            textDetail.text = @"description in english";
    
        }
    
        if (a==1){
    
            textDetail.text = @"description in greek";
        }
    
        break;
    
    
      case 1:
    
       // etc.
    }
    

    然后在切换块后的viewDidLoad languageSeg:中调用这个方法。

    【讨论】:

    • 它会出现在视图中..你能给我一个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2011-02-16
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多