2015-12-10 1 views
0

Когда пользователь пытается изменить состояние UISwitch в пользовательском UITableViewCell, я хочу уведомить пользователя о том, что он не разрешен, если нет активного подключения к Интернету. Моя проблема заключается в том, чтобы решить, где поставить логику проверки подключения к Интернету. Легче всего поставить его в пользовательский класс ячеек, но это класс представления и придерживаясь шаблона проектирования MVC, это может быть не самый лучший подход.Проверьте подключение к Интернету непосредственно из пользовательского UITableViewCell

Я попытался найти ответ на свой вопрос, но не смог найти ничего, что могло бы помочь мне в моем решении.

Благодарим вас за любые полезные предложения.

+0

Вы должны поместить эту логику в какое-то центрально доступное место, возможно, синглтон. –

ответ

2

Сначала вы загрузили класс возвращаемости по ссылке ниже.

Reachability Class

Затем импортировать класс достижимости в AppDelegate.h файле.

#import Reachability.h 

Пожалуйста, введите код, указанный в файле AppDelegate.h.

@property(nonatomic)Reachability *internetReachability; 
@property(nonatomic)BOOL isInternet; 

Обратите внимание, что APP_DELEGATE является экземпляром AppDelegate и IS_INTERNET является экземпляром переменной isInternet, которые объявлены в файле AppDelegate.h.

#define APP_DELEGATE ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 
#define IS_INTERNET APP_DELEGATE.isInternet 

После этого просто скопируйте и вставьте следующий код в файле AppDelegate.m и вызовите setupTheInternetConnection метод в didFinishLaunchingWithOptions метод.

-(void)setupTheInternetConnection {  

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

    //Setup Internet Connection 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 

    self.internetReachability = [Reachability reachabilityForInternetConnection]; 
    [self.internetReachability startNotifier]; 
    [self updateInterfaceWithReachability:self.internetReachability]; 
} 

- (void) reachabilityChanged:(NSNotification *)note { 

    Reachability* curReach = [note object]; 
    NSParameterAssert([curReach isKindOfClass:[Reachability class]]); 
    [self updateInterfaceWithReachability:curReach]; 
} 

- (void) updateInterfaceWithReachability: (Reachability*) curReach { 

    if(curReach == self.internetReachability) { 

     NetworkStatus netStatus = [curReach currentReachabilityStatus]; 

     switch (netStatus) { 

      case NotReachable: { 

       IS_INTERNET = FALSE; 
       break; 
      } 

      case ReachableViaWWAN: { 

       IS_INTERNET = TRUE; 
       break; 
      } 

      case ReachableViaWiFi: { 

       IS_INTERNET = TRUE; 
       break; 
      } 
     } 
    } 
} 

Теперь вы можете проверить подключение к Интернету в любом из контроллера, используя значение IS_INTERNET.

Надеюсь, что это сработает для вас.

+0

Благодарим за очень подробный ответ/решение. Я использую Reachability и думал о том, чтобы поместить код в одноэлементный, но мне нравится ваше решение и попробую его. ViewController, содержащий ссылку на tableView, устанавливается как делегат каждой ячейки и вызывается, когда пользователь переключает UISwitch. Если нет подключения к Интернету, ячейка перезагружается, и состояние UISwitch будет установлено на все, что было до того, как пользователь взаимодействовал с ним. Другим маршрутом может быть отключить UISwitch, как только нет подключения к Интернету, но пока я иду с первым маршрутом. – Sanxion

+0

Вы не должны ставить эту логику в AppDelegate. Дизайн приложения должен быть модульным, и этот подход приводит к беспорядочному и непригодному коду. Для простого обнаружения подключения к Интернету вы можете написать вспомогательные методы в назначенном классе, который не должен быть одноэлементным. Для постоянного мониторинга подключения к Интернету это может быть сделано снова назначенным классом, который создается или вводится в контроллер просмотра. Архитектура и дизайн приложения очень важны в этих ситуациях. –

+0

@RASS: Спасибо за понижение голосов в любом случае. –

1

У меня обычно есть NetworkManager, который имеет всю эту логику.

#import "NetworkManager.h" 
#import <Reachability.h> 
@implementation NetworkManager 

+ (void)performActionIfConnection:(void(^)())action andError:(void(^)())error{ 
    if ([NetworkManager test]) { 
     if (action) { 
      action(); 
     } 
    }else{ 
     if (error) { 
      error(); 
     } 
    } 
} 

+ (BOOL) test 
{ 
    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus remoteHostStatus = [reach currentReachabilityStatus]; 
    return !(remoteHostStatus == NotReachable); 
} 

@end 
+0

@Sanxion это то, чего вы хотите. –

-1

Ваша клетка не должна быть в курсе процесса ВООБЩЕ.

Потенциальная архитектура будет заключаться в том, чтобы контроллер просмотра постоянно знал о подключении к Интернету. Это может быть достигнуто с помощью класса networker, который обновляет VC о сетевых изменениях. Таким образом, VC может запускать соответствующие предупреждения e.t.c. когда пользователь удаляет переключатель.

+0

Согласен, один из возможных путей, которые я мог бы предпринять - на основе вашего ответа - было бы отключить UISwitch, как только нет подключения к Интернету. Поэтому вместо того, чтобы предупреждать пользователя, попадают ли они в коммутатор, пока нет подключения к Интернету, я отключил бы переключатель до тех пор, пока интернет-соединение снова не активировалось. – Sanxion

+0

Точно. Также я бы не поставил эту логику в ответе «AppDelegate» Рамкришны Шармы, это не хорошая практика, и его код ОЧЕНЬ хрупкий. –

+0

@ RASS: Если вы можете предоставить несколько хороших примеров, это было бы здорово, а не просто объяснять, что нам нужно сделать, чтобы обрабатывать интернет-соединение в VC. –

 Смежные вопросы

  • Нет связанных вопросов^_^