Уведомления на SegmentControl


#1

Всем привет, в моём приложении есть семь SegmentControl на них стоит функция на отправку уведомлений но почему то уведомления приходят во все дни недели если даже сегмент контрол находится в состояние выключенном import UIKit
import UserNotifications
class ViewController: UIViewController, UNUserNotificationCenterDelegate {

let notificationCenter = UNUserNotificationCenter.current ()



private var segmentIndex = "SegmentControlIndex"
private let segmentIndex2 = "SegmentControlIndex2"
private let segmentIndex3 = "SegmentControlIndex3"
private let segmentIndex4 = "SegmentControlIndex4"
private let segmentIndex5 = "SegmentControlIndex5"
private let segmentIndex6 = "SegmentControlIndex6"
private let segmentIndex7 = "SegmentControlIndex7"

































func scheduleNotificationForDayOfWeek(dayOfWeek: Int) {
    let content = UNMutableNotificationContent()
    content.title = "Reminder"
    content.body = "Time to go to workout"
    
    var dateComponents = DateComponents()
    dateComponents.weekday = dayOfWeek // Задайте номер дня недели (1 - воскресенье, 2 - понедельник и так далее)
    dateComponents.hour = 10 // Установите желаемое время в часах (например, 10:00 утра)
    
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
    
    let requestIdentifier = "notification_\(dayOfWeek)"
    let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger)
    
    UNUserNotificationCenter.current().add(request) { (error) in
        if let error = error {
            print("Error creating notification: \(error.localizedDescription)")
        } else {
            print("Notification for the day of the week \(dayOfWeek) successfully planned")
        }
    }
}




    
@IBOutlet weak var q:UISegmentedControl!


@IBOutlet weak var w: UISegmentedControl!

@IBOutlet weak var e: UISegmentedControl!
    

@IBOutlet weak var r: UISegmentedControl!
    
@IBOutlet weak var t: UISegmentedControl!



@IBOutlet weak var y: UISegmentedControl!



@IBOutlet weak var u: UISegmentedControl!



@IBOutlet weak var cal: UIButton!



@IBAction func segmentedControlValueChanged1(_ sender: UISegmentedControl) {
    if q.selectedSegmentIndex == 1{ switch sender {
    case q:
        scheduleNotificationForDayOfWeek(dayOfWeek: 1) // Понедельник
        
        
    default:
        break
    }
    }else {return}
}



@IBAction func segmentedControlValueChanged2(_ sender: UISegmentedControl) {
    if q.selectedSegmentIndex == 1{
    switch sender {
      
        case w:
            scheduleNotificationForDayOfWeek(dayOfWeek: 2) // Понедельник
            
            
        default:
            break
        }
    }
}


@IBAction func segmentedControlValueChanged3(_ sender: UISegmentedControl) {
    if e.selectedSegmentIndex == 1{
        switch sender {
            
        case e:
            scheduleNotificationForDayOfWeek(dayOfWeek: 3) // Вторник
            
            
        default:
            break
        }
    }
    
}



@IBAction func segmentedControlValueChanged4(_ sender: UISegmentedControl) {
    if r.selectedSegmentIndex == 1{
        switch sender {
            
        case r:
            scheduleNotificationForDayOfWeek(dayOfWeek: 4) // Среда
            // Продолжайте добавлять обработчики для остальных дней недели
            
            
            
        default:
            break
        }
    }
}


@IBAction func segmentedControlValueChanged5(_ sender: UISegmentedControl) {
    if t.selectedSegmentIndex == 1{
        switch sender {
            
        case r:
            scheduleNotificationForDayOfWeek(dayOfWeek: 5)
            
            
            
        default:
            break
        }
    }
}

@IBAction func segmentedControlValueChanged6(_ sender: UISegmentedControl) {
    
    if y.selectedSegmentIndex == 1{
        switch sender {
            
            
        case y:
            scheduleNotificationForDayOfWeek(dayOfWeek: 6)
            
            
            
            
        default:
            break
        }
    }
}

@IBAction func segmentedControlValueChanged7(_ sender: UISegmentedControl) {
    
    if u.selectedSegmentIndex == 1{
        switch sender {
            
            
        case u:
            scheduleNotificationForDayOfWeek(dayOfWeek: 7)
            
            
        default:
            break
        }
    }
}
@IBOutlet weak var save: UIButton!
override func viewDidLoad() {
    
    super.viewDidLoad()
    
    
    
    q.selectedSegmentIndex = 0
    
    w.selectedSegmentIndex = 0
    
    e.selectedSegmentIndex = 0
    r.selectedSegmentIndex = 0
    t.selectedSegmentIndex = 0
    y.selectedSegmentIndex = 0
    u.selectedSegmentIndex = 0
    
    
    
    
    
    
    save.addTarget(self, action:#selector (didTapSaveButton), for: .touchUpInside)
    
    
    
    
    q.addTarget(self, action:#selector (didTapSegmentControl), for: .valueChanged)
    
    
    
    q.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex)
    
    
    
    
    
    w.addTarget(self, action:#selector (didTapSegmentControl2), for: .valueChanged)
    
    
    
    w.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex2)
    
    
    
    e.addTarget(self, action:#selector (didTapSegmentControl3), for: .valueChanged)
    
    
    
    e.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex3)
    
    
    
    r.addTarget(self, action:#selector (didTapSegmentControl4), for: .valueChanged)
    
    
    
    r.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex4)
    
    
    
    
    
    t.addTarget(self, action:#selector (didTapSegmentControl5), for: .valueChanged)
    
    
    
    t.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex5)
    
    
    
    y.addTarget(self, action:#selector (didTapSegmentControl6), for: .valueChanged)
    
    
    
    y.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex6)
    
    
    
    
    
    u.addTarget(self, action:#selector (didTapSegmentControl7), for: .valueChanged)
    
    
    
    u.selectedSegmentIndex = UserDefaults.standard.integer(forKey: segmentIndex7)
    
    
    
    
    notificationCenter.requestAuthorization(options: [.alert,.sound,.alert]) { [self] (gretid, error) in
        guard gretid  else {return}
        notificationCenter.getNotificationSettings { (settings) in
            guard settings.authorizationStatus == .authorized else {return}
            
        }
    }
    
    
   
            
            
            
            
            
            
            
            
            
        }
        
        
        
        
        
 










    @objc func didTapSaveButton(){
         
     }
    
    
    @objc func didTapSegmentControl(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex)
        
    }
    @objc func didTapSegmentControl2(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex2)
        
    }
        
    @objc func didTapSegmentControl3(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex3)
        
    }
    
    @objc func didTapSegmentControl4(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex4)
        
    }
    
    
    @objc func didTapSegmentControl5(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex5)
        
    }
    
    
    @objc func didTapSegmentControl6(sender: UISegmentedControl){
       UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex6)
        
    }
    
    
@objc func didTapSegmentControl7(sender: UISegmentedControl){
    UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: segmentIndex7)
    
}
        
        
      
        
        
        

}

как мне решить эту проблему?


#2

Никогда так не делайте. Если у вас будет много однотипных элементов, вы же не будете для каждого писать отдельный метод и прочее. Это первое.
Второе, у вас в первых двух методах Changed проверяется элемент “q”.

Далее, все сегменты подписываете только на ОДИН метод, аналогично с touchUpInside, тоже на один метод. Проверка сегмента в методах будет простая

switch sender {
case q: ...
case r: ...
default: ...
}

Но и это можно сократить создав соответствующий enum.

Далее, что бы задавать начальный индекс каждому сегменту, соберите все сегменты в массив и пройдитесь через этот массив, задавая индекс. Так же советую задать каждому сегменту свой tag, который будет соответствовать своему дню.

Далее, работать с UserDefaults можно проще, через составной ключ, который будет содержать общее начало “segmentIndex” и добавлять tag.

Если сократите код, то и ошибки в логике будет проще найти.