#ios
#iOS
Вопрос:
Я пытаюсь создать кнопку, которая при нажатии будет вызывать человека, отображаемого на UIView
. Информация о каждом пользователе передается через переход, чтобы использовать только шаблон UIWebView
в раскадровке, но будет отображаться как другой человек, когда пользователь из списка щелкнет и отобразится с его информацией. Это работает с изображением, заголовком и меткой, но не с кнопками для вызова текстовых сообщений или подкачки по страницам, поскольку в нем указан несовместимый тип указателя, так как я могу это исправить? Также как я могу заставить функцию отправки текстовых сообщений работать в этом коде? Вызов и поиск по страницам работают нормально при попытке создать вызов, но не работают из-за первой проблемы.
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = self.person.personName;
self.personImageView.image = [UIImage imageNamed:self.person.personImage];
self.nameLabel.text = self.person.personName;
self.textButton = self.person.textNumber; //Warning here: incompatible pointer type from NSString to UIButton"
self.callButton = self.person.phoneNumber; //Warning here: incompatible pointer type from NSString to UIButton?
self.pageButton = self.person.pagingNumber; //Warning here: incompatible pointer type from NSString to UIButton
}
-(IBAction)callPhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://phoneNumber"]];
}
-(IBAction)textPhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"smsprompt://textNumber"]];
}
-(IBAction)pagePhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://pagingNumber"]];
}
Комментарии:
1. В каких строках возникает проблема? Каково полное и точное сообщение об ошибке? Каковы фактические типы используемых значений? Поместите всю эту информацию в свой вопрос.
Ответ №1:
Поскольку ваша кнопка имеет общий макет для каждой «карточки пользователя», я бы рекомендовал передавать информацию, относящуюся к кнопке, через ваш segue вместо самой кнопки:
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = self.person.personName;
self.personImageView.image = [UIImage imageNamed:self.person.personImage];
self.nameLabel.text = self.person.personName;
self.numberValue = self.person.textNumber;
self.phoneNumberValue = self.person.phoneNumber;
self.pagingValue = self.person.pagingNumber;
}
-(IBAction)callPhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@", self.phoneNumberValue]];
}
-(IBAction)textPhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"smsprompt:%@", self.numberValue]]];
}
-(IBAction)pagePhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@", self.pagingValue]];
}
Где self.numberValue
, self.phoneNumberValue
self.pagingValue
находятся NSString
.
РЕДАКТИРОВАТЬ: простой пример для передачи значения
В следующем примере я покажу вам, как передавать ваши значения через ваши контроллеры, обратите внимание, что я сосредоточился не на вашем «макете», а на самом деле только на вашей проблеме, включив свою рекомендацию (передача данных вместо самой кнопки). Я также добровольно удалил неподходящий метод для этого примера ( didReceiveMemoryWarning
, initWithNibName
и т.д.).
Надеюсь, это поможет
UITableViewController.m:
@implementation _4601253ViewController {
UITableView *tableView;
NSMutableArray *phoneNumberList;
}
- (void)viewDidLoad
{
/* Init objects */
phoneNumberList = [[NSMutableArray alloc] initWithObjects:@"232323", @"434445", @"367843", @"938472", nil];
[super viewDidLoad];
// Do any additional setup after loading the view.
tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];
}
#pragma mark - UITableView DataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [phoneNumberList count];;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
cell.backgroundColor = [UIColor clearColor];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 30, 20)];
label.text = @"phone number:";
UILabel *phoneNumberValue = [[UILabel alloc] initWithFrame:CGRectMake(40, 10, 100, 20)];
phoneNumberValue.text = [NSString stringWithFormat:@" 262692 %@", [phoneNumberList objectAtIndex:indexPath.row]];
phoneNumberValue.font = [UIFont fontWithName:@"Arial" size:10];
[cell addSubview:phoneNumberValue];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ReceiverViewController *rvc = [[ReceiverViewController alloc] init];
rvc.phoneNumberValue = [phoneNumberList objectAtIndex:indexPath.row];
[self presentViewController:rvc animated:YES completion:nil];
//[self.navigationController pushViewController:rvc animated:YES];
}
Ваш принимающий UIViewController.m:
@implementation ReceiverViewController
@synthesize phoneNumberValue = _phoneNumberValue; // In your .h you should define this property
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor lightGrayColor];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(30, 100, 250, 30)];
[button.layer setBorderColor:[UIColor blackColor].CGColor];
[button.layer setBorderWidth:1.0];
[button setTitle:[NSString stringWithFormat:@"call me: 262692 %@", _phoneNumberValue] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonTapped:(id)sender
{
// Your method here
}
Комментарии:
1. Хорошо, итак, в ViewController.h для этого у меня все равно было бы ‘свойство (слабое, неатомное) IBOutlet UIButton *phoneNumberValue; свойство (слабое, неатомное) IBOutlet UIButton * numberValue; свойство (слабое, неатомное) IBOutlet UIButton * pagingValue; Или свойство (слабое, неатомное) IBOutlet NSString *phoneNumberValue; свойство (слабое, неатомный) IBOutlet NSString *Числовое значение; свойство (слабое, неатомное) IBOutlet NSString * значение страницы;’
2. Нет, в вашем
view controller
вы должны создать 3 новыхNSString
имени «numberValue», «phoneNumberValue» и «pagingValue» (см. Последнюю цитату из моего поста). NSString не должна быть IBOutlet, просто глобальной переменной, которая может быть установлена извне (в вашем случае с помощью TableViewController). Итак, наконец, ваша схема должна быть:TableViewControllerA -> cellSelectionned -> pushViewControllerBWithPassedNSString -> InitButtonWithPassedNSStringValue
3. Хорошо, когда я делаю это, хотя приложение вылетает, когда я нажимаю на человека в табличном представлении из-за неперехваченного исключения ‘NSUnknownKeyException
4. @user3705631 Мне нужно больше информации о вашей новой проблеме, вам следует обновить свой первоначальный пост
5. Да, но сбой происходит только тогда, когда я внедряю этот новый код в систему. Но в остальном работает так, что я могу получить доступ к данным о персоналиях, но не могу заставить звонок, текстовое сообщение или подкачку работать.
Ответ №2:
Вы пытаетесь назначить NSString
для UIButton
.
- self.callButton — это
(UIButton *)
- self.person.PhoneNumber — это
(NSString *)
Чтобы задать название кнопки, сделайте это:
[self.callButton setTitle:self.person.phoneNumber
forState:UIControlStateNormal
];
[self.callButton addTarget:self
action:@selector(callPhone:)
forControlEvents:UIControlEventTouchUpInside
];
Комментарии:
1. Хорошо, да, когда я пытаюсь это сделать, текст кнопок меняется на номер, и я вроде как хочу обратное, я хочу, чтобы отображались имена, но при нажатии отображается номер для вызова
2. Возможно, вам не хватает action:@selector (callPhone:)
Ответ №3:
На самом деле я смог заставить это работать, поиграв с кодом, который вы оба мне дали, и в итоге получил вот это.
[self.callButton addTarget:self action:@selector(callPhone:) forControlEvents:UIControlEventTouchUpInside];//call button
-(IBAction)callPhone:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@", self.person.phoneNumber]]];
Огромное спасибо за помощь в решении этой проблемы. Хотя кнопка sms по-прежнему не работает, и любые советы по исправлению этого также были бы весьма признательны.