大家好我试图隐藏第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
我愿意接受更好的想法来实现我想要实现的目标,所以如果你考虑告诉我一个更有效的方法,我将不胜感激。我知道代表可能是一个选择,但我对他们还没有信心,并认为这对我来说会更容易。
答案 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;
}
这基本上可以隐藏但不会删除文本字段中的信息。如果您想要保留用户输入的任何信息,这非常有用。
我希望这可以帮助任何人试图隐藏分组静态表视图控制器中的行。