Как я могу позвонить на другой номер телефона с помощью одной кнопки?

#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 .

  1. self.callButton — это (UIButton *)
  2. 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 по-прежнему не работает, и любые советы по исправлению этого также были бы весьма признательны.