呈现ViewController时,UITableviewcell属性会发生变化

时间:2014-04-10 11:53:59

标签: ios objective-c uitableview

所以,这里是我的情况描述:我的视图中有各种buttons,每个都呈现模态或其他视图(通过推送)。我的问题是,当点击任何按钮时,UITableView 属性会发生变化并导致用户界面发生变化。

我一直跟踪这个问题:

2014-04-10 12:48:29.652 ClosedApp[5229:70b] (
    "<UITableViewCell: 0x10ad20530; frame = (0 0; 320 44); text = 'Yes '; layer = <CALayer: 0x10ad20310>>",
    "<UITableViewCell: 0x10ad24610; frame = (0 0; 320 44); text = 'No '; layer = <CALayer: 0x10ad24900>>"
)

在呈现其他视图并返回父视图后,以下是日志:

2014-04-10 12:48:36.931 ClosedApp[5229:70b] (
    "<UITableViewCell: 0x10ad20530; frame = (0 0; 280 44); text = 'Yes '; autoresize = W; layer = <CALayer: 0x10ad20310>>",
    "<UITableViewCell: 0x10ad24610; frame = (0 44; 280 44); text = 'No '; hidden = YES; autoresize = W; layer = <CALayer: 0x10ad24900>>"
)

我已仔细检查了我的代码,但在performSegue方法发生期间或之后都没有改变。

我使用此代码从服务器请求数据(在viewDidLoad方法中调用):

- (void)loadQuestion {
    NSDictionary *param = @{ @"token": engine->token, @"view_session": sessionId };

    [manager POST:@"?type=getData" parameters:param success: ^(AFHTTPRequestOperation *operation, id response) {
        if ([[response objectForKey:@"success"] boolValue]) {
            //some code here changing the content of the entire view, no frames are changed
            optionList = [response objectForKey:@"options"];

            [self.optionList reloadData];
            CGRect answersFrame = self.optionList.frame;
            answersFrame.size.height = self.optionList.contentSize.height;
            self.optionList.frame = answersFrame;

            //hiding some subviews here
        }
        else {
            //show an error, params are wrong

        }
    } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
        [SVProgressHUD showErrorWithStatus:@"Please check your internet connection"];
        NSLog(@"Error: %@", error);
    }];
}

现在这里是负责填充表格的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *option = [optionList objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             @"Cell" forIndexPath:
                             indexPath];

    cell.textLabel.text = [answer objectForKey:@"text"];

    UILabel *accessoryView = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 30, 20)];

    accessoryView.text = [answer objectForKey:@"votes"];
    accessoryView.backgroundColor = [UIColor grayColor];
    accessoryView.textColor = [UIColor whiteColor];


    cell.accessoryView = accessoryView;
    cell.backgroundColor = [UIColor colorWithRed:247 / 255.0f green:248 / 255.0f blue:250 / 255.0f alpha:1.0f];

    return cell;
}

我已经将代码的行为方式从表格的静态高度更改为每个单元格增加到高度为44 * CellCount的表格,并使UIView大小为静态并启用Clip Subviews ,在[self.optionList reloadData]下,我添加了一个代码来调整UIView帧高度以适应可用的单元格,代码仍然表现相同。

我已经为测试创建了一个新视图,相同的结果,这里有一些发生的事情: https://www.dropbox.com/s/26u0wkn2jm2y72v/damn.gif

编辑:经过进一步调查后,我注意到即使UIImage属性也发生了变化: 在呈现视图之前:before返回视图后:after

正如您所看到的那样,图片的大小增加了......

更新:为了澄清更多的事情,我倾向于在可能的情况下为同一个对象使用相同的变量名称:

@interface MyViewController ()

@property (strong, nonatomic) IBOutlet UITableView *optionList;

@end

NSArray *optionList;

@implementation MyViewController
....

4 个答案:

答案 0 :(得分:0)

我的猜测是,您尝试手动调整UITableViewCell自动调整掩码/帧,而拥有单元格的表格视图会尝试执行相同操作。

您不应触摸单元格的蒙版和框架,但可以更改其他参数,例如背景颜色以及是否应剪切子视图。

您可以通过修改单元格contentView来实现您尝试获得的调整和自定义,您可以自由地执行任何操作。

答案 1 :(得分:0)

Tableview委托方法发生了什么变化?

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 { }

您的代码是手动格式化tableview单元格而不通过tableview委托方法(或者您只是编写For语句以使其更具可读性?)。

我问的原因是

        [self.optionList reloadData];

是按顺序运行一系列Tableview委托方法的触发器。这包括CellforRowAtIndexPath,可能在某处有一些冲突的代码。我相信如果你没有编码,它会执行默认代码,可能会删除你的修改。

我不完全理解最后3行代码的存在与否会影响您的表视图单元格,除了更改UITableView实例的帧大小通常需要视图刷新并触发@Rivera所提到的auto_resizing。 tableviewCell高度通常从tableview属性中获取其值(&#34; 44&#34;),无论表格视图是否调整大小都无关紧要。根据您的日志自动调整大小W(我认为Width代表Width对单元格有效)。

答案 2 :(得分:0)

对于正在发生的事情以及你所询问的内容,这是非常过分的,令人困惑的解释。

有两种方法可以调整视图大小:

  1. 使用自动布局约束并更改高度约束。
  2. 手动为您的视图和设置框设置translatesAutoresizingMaskIntoConstraints = YES
  3. 作为旁注,让我想到你的界面崩溃的原因:

    1. 不应该以这种方式创建单元格,请特别阅读UITableViewDataSource tableView:cellForRowAtIndexPath:

    2. UITableView经过优化,可以重复使用固定数量的单元格以避免内存溢出。这就是您建议使用dequeueReusableCellWithIdentifier:forIndexPath:

    3. 的原因
    4. 除此之外,如果你的所有元素都有固定的高度,你可以计算你的tableview的高度,因此你可以在初始化时调整表视图的大小。

答案 3 :(得分:0)

tableView:cellForRowAtIndexPath:中的代码填充'选项'但从不使用它。相反,它使用变量'answer'。因此,每个tableview单元格应该看起来相同。这是真的吗?

没有足够的代码来识别错误并提供明确的解决方案;但是,看起来你几天都在苦苦挣扎,所以我会提出这个建议......回到基础。

您似乎正在尝试根据您拥有的号码答案来调整您的tableview的大小。您可能只需使用标准的UITableViewController并添加标题和放大器即可获得更好的运气。页脚视图 - 但我会假设你考虑过这个并且需要你在gif中呈现的UI。无论如何,您应该注释掉调整UITableView大小的所有代码。现在把它设置为好看和大,并担心以后调整它的大小。看来你的部分代码被破坏了,因为如果你将tableview框架设置为它的内容大小,它就不应该滚动。您应该设置tableview的背景颜色,以便清楚地看到它的界限。 self.optionsList.backgroundColor = [UIColor yellowColor];

接下来,您应该删除大部分用于填充表的代码/逻辑。对于numberOfRowsInSection,只返回10;在您的cellForRowAtIndexPath中,只返回相同的硬编码值:cell.textLabel.text = @"hello there";。注释掉那里的所有其余代码。 (顺便说一句:你不应该重新创建那个附件视图,因为你正在重新使用单元格,只需获取它并设置它的属性。只有当它不存在时才创建它。)

你现在应该有一个黄色的桌面视图,其中有10个单元格,所有人都说'你好'。您应该在屏幕上注释掉所有其他代码,这样您就可以专注于手头的问题(您的错误)。

然后,您可以解决您的模型。只需创建一个假模型而不是使用AFNetworking(现在)。加载视图时;只需创建一个小数据集。

self.optionsList = @[
   @{@"text":"some text", @"votes":@"1"},
   @{@"text":"more text", @"votes":@"2"},
   @{@"text":"diff text", @"votes":@"3"},
   @{@"text":"text ahoy", @"votes":@"4"},
];

更新您的tableView:numberOfRowsInSection:方法以返回[optionsList count](正如之前应该的那样)。

如果你仍然看到swirlyness,请注释掉更多代码!

此外,修复此文件中显示的任何警告。

祝你好运。