静态单元格 - 使用heightforRowatIndexPath方法隐藏

时间:2014-07-31 11:27:42

标签: ios objective-c sections

大家好我试图隐藏第1部分(第二部分)中的一些行,具体取决于用户选择的反馈类型:

我使用的是静态单元格,但是当我选择TypeVC中的一个选项时,目前没有删除任何内容。目前没有错误,但猜测我认为它与我在switch语句中使用的逻辑运算符有关。很抱歉抛弃我的代码,但由于我对IOS很新,我不知道你们究竟需要看到什么。

[1]

if (variable == (1|2|3)){} 

我已经习惯了Java,我经常使用这种语句,因为它可以节省写作。这是如何在objective-c中做到的?

[2]

我在哪里以及如何在这里试图让细胞消失?

FeedbackTableViewController:

#import "FeedbackTableViewController.h"
#import "TypeTableViewController.h"

@interface FeedbackTableViewController ()

@property NSInteger index;

@end

@implementation FeedbackTableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void)viewDidAppear:(BOOL)animated{

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (NSIndexPath *) tableView:(UITableView *)tableView
   willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Type: %i",_type);
    if (indexPath.section == 0 && indexPath.row == 0)
        [self performSegueWithIdentifier:@"showTypeVC" sender:self];

    return indexPath;
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    TypeTableViewController *tvc = [segue destinationViewController];
    tvc.indexchoosen = _index;
}

//- (UITableViewCell *)tableView:(UITableView *)tableView
//         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//    
//    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
//    
//    if (indexPath.row==0) cell.textLabel.text = _typeString;
//    else if (indexPath.row) 
//    
//    return cell;
//}

- (CGFloat)   tableView:(UITableView *)tableView
    heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"section: %i row:%i",indexPath.section, indexPath.row);
    if (indexPath.section == 1) {
        switch (_type) {
            case 0:
                if (indexPath.row==(2|3|4))return 0;
                break;
            case 1:
                if (indexPath.row==(0|1|4))return 0;
                break;
            case 2:
                if (indexPath.row==(0|1|2|3))return 0;
                break;
            case 3:
                return 0;
                break;
            case 4:
                return 0;
                break;
            case 5:
                return 0;
                break;
            default:
                return 0;
                break;
        }
    }
    return 43;
}

- (IBAction)unwindtypeVC:(UIStoryboardSegue *)segue { }


@end

TypeTableViewController:

#import "TypeTableViewController.h"
#import "FeedbackTableViewController.h"

@interface TypeTableViewController ()

@end

@implementation TypeTableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    _typeoptions = @[@"Routing Issues",
                     @"Wrongly Labelled Location",
                     @"Missing Location",
                     @"Comment on Useability",
                     @"Suggestions",
                     @"General Feedback"];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 6;
}


- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.typeoptions[indexPath.row];


    return cell;
}

- (NSIndexPath *)tableView:(UITableView *)tableView
  willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    _indexchoosen = indexPath.row;

    return indexPath;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    NSString *string = _typeoptions[_indexchoosen];
    FeedbackTableViewController *fvc1 = [segue destinationViewController];
    fvc1.typeString.text = _typeoptions[_indexchoosen];
    fvc1.type = _indexchoosen;
}

@end

我愿意接受更好的想法来实现我想要实现的目标,所以如果你考虑告诉我一个更有效的方法,我将不胜感激。我知道代表可能是一个选择,但我对他们还没有信心,并认为这对我来说会更容易。

2 个答案:

答案 0 :(得分:0)

对于[1],试试这个并亲自看看:

int test = 3;
if(test == (1 | 2))
    NSLog(@"_MEH_");

由于它是按位OR运算,0010 | 0001等于0011,等于3.因此,我不建议你使用这样的操作。 (如果那不是故意的话)。

对于[2],你应该使用deleteRowsAtIndexPaths:withRowAnimation:调用UITableView以删除行。

例如;

[self.tableView beginUpdates];

NSIndexPath* rowToDelete = [NSIndexPath indexPathForRow:0 inSection:0];  // For showing purposes only.
NSArray* indexArray = [NSArray arrayWithObjects:rowToDelete, nil];

[self.tableView deleteRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationMiddle];

[self.tableView endUpdates];

另外,请勿忘记更新数据源。您可能想要从

中删除一些对象
self.typeoptions

阵列。

P.S:另外一个补充,您还应该更改tableView:numberOfRowsInSection:因为行数少于6。

答案 1 :(得分:0)

我实际上设法使用这种将行高改为0的方法。

为了有效地做到这一点,我不得不删除我不想要显示的行中的占位符/任何初始文本。这需要一些故事板连接,您将看到它们被命名为_feedbackText _startLocation等。当用户选择新行时,它们将执行原始反馈表单的segue,因此调用了viewDidAppear。我用它来调用[self.tableView reloadData]。最初变量_type的变化实际上不会改变任何东西,只是在重新加载数据时会调用heightForRowAtIndexPath。

我确信在indexPath上使用删除行也会有用,但我想在更改反馈类型之前存储用户可能输入的信息。

新方法:

- (CGFloat)   tableView:(UITableView *)tableView
    heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSInteger i = indexPath.row;
    if (indexPath.section == 1) {
        switch (_type) {
            case 0:
                _startLocation.placeholder = @"Start Location:";
                _destination.placeholder = @"Destination:";
                _locationName.placeholder = @"";
                _correctName.placeholder = @"";
                _missingLocation.placeholder = @"";
                if (i==2||i==3||i==4) return 0;
                break;
            case 1:
                _startLocation.placeholder = @"";
                _destination.placeholder = @"";
                _locationName.placeholder = @"Location Name:";
                _correctName.placeholder = @"Correct Name:";
                _missingLocation.placeholder = @"";
                if (i==0||i==1||i==4)return 0;
                break;
            case 2:
                _startLocation.placeholder = @"";
                _destination.placeholder = @"";
                _locationName.placeholder = @"";
                _correctName.placeholder = @"";
                _missingLocation.placeholder = @"Missing Location:";
                if (i==0||i==1||i==2||i==3)return 0;
                break;
            case 3:
                return 0;
                break;
            case 4:
                return 0;
                break;
            case 5:
                return 0;
                break;
            default:
                _startLocation.placeholder = @"";
                _destination.placeholder = @"";
                _locationName.placeholder = @"";
                _correctName.placeholder = @"";
                _missingLocation.placeholder = @"";
                if (i==0||i==1||i==2||i==3||i==4)return 0;
                break;
        }
    } else if (indexPath.section==2 && indexPath.row==2) return 240;
    else if (indexPath.section==0 && indexPath.row==0) return 40;


    return 30;
}

这基本上可以隐藏但不会删除文本字段中的信息。如果您想要保留用户输入的任何信息,这非常有用。

我希望这可以帮助任何人试图隐藏分组静态表视图控制器中的行。