2012-06-20 66 views
3

首先关闭标签将不起作用。我这样说是因为我创建了4个按钮,并且对于特定的单元格使用相同的标记,例如indexPath.row = tag。如何检查两个对象(UIButtons)是否相同

里面我TableViewCellForRowAtIndexpath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
static NSString *CellIdentifier = @"courseCell"; 

//Step 1: Check to se if we can reuse a cell from a row that has just rolled off the screen 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

//step 2: If there are no cell to reuse, create a new one 
if (cell == nil){ 
    cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    cell.selectionStyle = UITableViewCellSelectionStyleGray; 
} 
... 


    //-------------Creation of Custom Buttons-------------// 

    //-----img = "radioOn.png"-----// 
    //----img2 = "radioOff.png"----// 

    //----RadioButtonA----// 
    ... 

    radioButtonA = [UIButton buttonWithType:UIButtonTypeCustom]; 

    [radioButtonA addTarget:self action:@selector(radioButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    radioButtonA.tag=indexPath.row; 

    //----End RadioButtonA----// 

    //----RadioButtonB----// 

    radioButtonB = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [radioButtonB addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 
    radioButtonB.tag =indexPath.row; 
... 

    //----End RadioButtonB----// 

    //----RadioButtonC----// 

    radioButtonC = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [radioButtonC addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 
    radioButtonC.tag = indexPath.row; 
... 

    //----End RadioButtonC----// 

    //----RadioButtonNA----// 

    radioButtonNA = [UIButton buttonWithType:UIButtonTypeCustom]; 
    radioButtonNA.tag = indexPath.row; 
    [radioButtonNA addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 

    ... 

    //----End RadioButtonC----// 

    //---------End of Radio Button Creations---------// 

    //---------UIStepper & StepperLabel Creation-----// 




    [cell.contentView addSubview:radioButtonA]; 
    [cell.contentView addSubview:radioButtonB]; 
    [cell.contentView addSubview:radioButtonC]; 
    [cell.contentView addSubview:radioButtonNA]; 

//Step4: Return the cell 
return cell; 
} 

#pragma mark - Buttons 

- (void)radioButtonClicked:(UIButton *)sender 
{ 

UIButton *myButton = sender; 


// This Method and all the ones similar to this method is created to handle the UITouchUpInsideEvent that the user sends when pressing the radioButtons A-NA. 

[radioButtons addObject:sender]; 

// Create an instance(object) of class NSIndexPath called indexPath and set its value the indexPath of the cell the user is currently in. 
UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview]; 
NSIndexPath *indexPath = [myTableView indexPathForCell:cell]; 


// Initialize two unique variables in order to check if the buttons being clicked are being referenced in the correct index. 
int row = indexPath.row; 
NSLog(@"Button is in row %d", row); 

... 

} 

-(IBAction)button:(UIButton*)sender{ 
    ... 
@try { 
    for (i=0; i<8; i++) { 

     if ([credits count ] ==0) { 
      break; 
     } 

这里就是我试图访问我在小区创建的单选按钮。我想这样做是这样的

如果([学分objectAtIndex:1])== radioButtonA {

做的东西。原因im不说== [radioButtonA标签]是因为我有三个其他按钮都具有相同的标签。如果你阅读了代码,你就会明白为什么这些标签是这样设置的。 }

我要求的是1帮助,2有另一种方法来检查两个按钮即对象是否相等,而不必依赖于他们的标签。

不要担心尝试捕捉最后我用它来赶上抛出的异常。

 if ([[[[credits objectAtIndex:i]titleLabel]text] isEqualToString:@"A"]) { 
      NSLog(@"radioA is in array"); 
      creditHours+=[[valueArray objectAtIndex:i]doubleValue]; 
      gradeEarned+=(GradeA.doubleValue *[[valueArray objectAtIndex:i]doubleValue]); 
      NSLog(@"%f",gradeEarned); 
      continue; 
     } 

     if ([[[[credits objectAtIndex:i]titleLabel]text] isEqualToString:@"B"]) { 
      NSLog(@"radioB is in array"); 
      creditHours+=[[valueArray objectAtIndex:i]doubleValue]; 
      gradeEarned+=(GradeB.doubleValue *[[valueArray objectAtIndex:i]doubleValue]); 
      continue; 
     } 

     if ([[[[credits objectAtIndex:i]titleLabel]text] isEqualToString:@"C"]){ 
      NSLog(@"radioC is in array"); 
      creditHours+=[[valueArray objectAtIndex:i]doubleValue]; 
      gradeEarned+=(GradeC.doubleValue *[[valueArray objectAtIndex:i]doubleValue]); 
      continue; 
     } 

     if([credits objectAtIndex:i]== radioButtonNA){ 
      NSLog(@"boboboobbobob"); 
      continue; 
     } 
    } 
} 
@catch (NSException *exception) { 
    NSLog(@"NSException Caught"); 
    NSLog(@"Name: %@",exception.name); 
    NSLog(@"Reason: %@", exception.reason); 
} 
@finally { 
    NSLog(@"in finally block"); 
} 

//  if ([credits objectAtIndex: i] == defaulter) { 
//      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Failed to select all grades" message:[NSString stringWithFormat:@"Your grade selections have been reset"] delegate:self cancelButtonTitle:@"great"otherButtonTitles:nil]; 
//      [alert show]; 
//      [alert release]; 
//   [self refreshArray]; 
//  } 


NSLog(@"%f",gradeEarned); 

if (gradeEarned == 0) { 
    textLabel.text= [NSString stringWithFormat:@"%f",gradeEarned]; 
}else { 
    NSLog(@"boob"); 
    sum= (gradeEarned)/(creditHours); 
    NSLog(@"%f",sum); 
    textLabel.text= [NSString stringWithFormat:@"%f",sum]; 
    //[self refreshArray]; 
} 

} 

有关详细信息。在这里是日志...
的NSLog(@ “%@”,[币objectAtIndex:ⅰ]); NSLog(@“%@”,radioButtonA);

 THE First output is the log of the [credits object atIndex:i] 

UIButton:0x6c91430; frame =(86 110; 32 30); opaque = NO;层= CALayer:0x6c914f0

2012-06-20 20:24:01.568 TableView [12557:f803] UIButton:0x6ea8ad0; frame =(86 110; 32 30); opaque = NO; tag = 6;层= CALayer的:0x6e746e0

正如你所看到的UIBUttons是不同的。因此==操作符不工作

+0

==应该正常工作。你有错误吗?如果是这样,错误是什么?堆栈跟踪? – sosborn

+0

与上述评论商定,具体而言,''==应用于对象测试地址是否相等,从而,如果它是由一个不同的变量引用的同一个对象,它会在那个一个地址。 –

+0

这里是日志... NSLog(@“%@”,[credits objectAtIndex:i]); NSLog(@“%@”,radioButtonA);第一个输出是[信贷对象atIndex:i]的日志2012-06-20 20:22:14。219 TableView [12536:f803] >这第二个日志是radioButtonA的日志2012-06-20 20:22:14.220 TableView [12536:f803] > – KING

回答

0

我不知道,在方法, - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 你应该添加按钮,只有当细胞这样

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"courseCell"; 

    //Step 1: Check to se if we can reuse a cell from a row that has just rolled off the screen 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    //step 2: If there are no cell to reuse, create a new one 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.selectionStyle = UITableViewCellSelectionStyleGray; 
     //-------------Creation of Custom Buttons-------------// 

     //-----img = "radioOn.png"-----// 
     //----img2 = "radioOff.png"----// 

     //----RadioButtonA----// 
      ... 

     radioButtonA = [UIButton buttonWithType:UIButtonTypeCustom]; 

     [radioButtonA addTarget:self action:@selector(radioButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     radioButtonA.tag=indexPath.row; 

     //----End RadioButtonA----// 

     //----RadioButtonB----// 

     radioButtonB = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [radioButtonB addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 
     radioButtonB.tag =indexPath.row; 
     ... 

//----End RadioButtonB----// 

//----RadioButtonC----// 

     radioButtonC = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [radioButtonC addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 
     radioButtonC.tag = indexPath.row; 
     ... 

//----End RadioButtonC----// 

//----RadioButtonNA----// 

      radioButtonNA = [UIButton buttonWithType:UIButtonTypeCustom]; 
      radioButtonNA.tag = indexPath.row; 
     [radioButtonNA addTarget:self action:@selector(radioButtonClicked:)forControlEvents:UIControlEventTouchUpInside]; 

... 

//----End RadioButtonC----// 

//---------End of Radio Button Creations---------// 

//---------UIStepper & StepperLabel Creation-----// 




     [cell.contentView addSubview:radioButtonA]; 
     [cell.contentView addSubview:radioButtonB]; 
     [cell.contentView addSubview:radioButtonC]; 
     [cell.contentView addSubview:radioButtonNA]; 
} 
    ... 

    //Step4: Return the cell 
    return cell; 
} 
+0

这导致单元格加载多次... – KING

+1

如何使用自定义单元格? – Siam

5

当检查,对一二对象另一个你不能使用==,你必须使用[objectA isEqual:objectB],如果这两个对象是一样的答案是YES和否,如果他们不是。

要了解更多,请访问:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

,并检查什么是书面的isEqual:

+0

对象[对象A的isEqual:对象B]将永远不会在我的程序等于...当点击了按钮被发送者被放置到一个数组,并且发送器(UIButton的)正被改变每次程序运行。我不会发布这个问题,如果这是我已经尝试了所有我能想到的解决方案的解决方案,所以我张贴在这里接受帮助。谢谢,即使你的方法不起作用。 – KING

+0

正确的!另外,如果你是比较同类型的对象,你可以使用这些更专业的功能:“isEqualToString:','isEqualToArray'等 – pasawaya

+1

==应该只是罚款为指针... – WendiKidd

0

我已经知道这个nil.just,然而,这篇文章的目的是为了看看他们是任何其他方式。我还使用了isMemberOfClass:[UIButton class]来进一步缩小范围。最好的方法和最有效的方法是使用对象的标签进行比较。

相关问题