2016-01-06 4 views
1

Мне нужно определить, является ли Uiview стандартным открытым представлением или если это активированный видовой экран на листе. Запрос идентификатора uiview Id возвращает Id из окна активированного вида просмотра. Я не нашел прямого способа обнаружить, что uiview на самом деле является листом с активированным окном просмотра.Как я могу определить, что uiview - это активированный видовой экран

Я уже отслеживаю открытые виды в режиме активированного события для другой цели. Поэтому я рассмотрел возможность хранения идентификатора представления с хэш-кодом uiview для последующей проверки того, что он действительно был просмотром листа перед тем, как стать активированным представлением. К сожалению, и я думаю, что в отличие от стандартного использования, хэш-код uiview нестабилен. Несколько запросов хэш-кода из объекта uiview возвращают разные значения.

У кого-нибудь есть способ обнаружить это состояние? Мне нужно иметь возможность использовать методы на uiview. Поэтому любая помощь в поиске реальных дочерних окон, которые я хотел бы связать с объектом uiview. В представлении показывается «Лист: ...» в заголовке, когда открывается представление.

+0

Hashcode не является стабильным, потому что, когда вы получаете UIView, это управляемая оболочка, которая герметизирующая собственный объект. Каждый раз, когда вы запрашиваете его, создается новая оболочка. И даже если он был стабильным, хеши не гарантированы быть уникальными (он просто используется для помещения предметов в отсеки). – Maxence

+0

Кажется невозможным использовать неустойчивый хэш-код для хранения, сравнения и т. Д. Но я понимаю, что объект, который я получаю, не является одним и тем же обтекающим объектом каждый раз. Спасибо. –

ответ

-1
  TaskDialog mainDialog = new TaskDialog("Hello, viewport check!"); 
      mainDialog.MainInstruction = "Hello, viewport check!"; 
      mainDialog.MainContent = 
        "Sadly Revit API doesn't automatically know if the user is in an active viewport. " 
        + "Please click 'Yes' if your are, or 'No' if your not."; 

      mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, 
        "Yes, I am in an active viewport on a sheet."); 
      mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, 
          "No, I am just in an ordinary view."); 

      mainDialog.CommonButtons = TaskDialogCommonButtons.Close; 
      mainDialog.DefaultButton = TaskDialogResult.Close; 


      TaskDialogResult tResult = mainDialog.Show(); 

      bool YesOrNo = true; 

      if (TaskDialogResult.CommandLink1 == tResult) 
      { 
        YesOrNo = true; 

      } 

      else if (TaskDialogResult.CommandLink2 == tResult) 
      { 
        YesOrNo = false; 
      } 
          else{ 
      return; 
       }  
+0

Веселый. И лучшее решение! –

1

Вы можете использовать метод ViewSheet GetAllViewports для определения всех видовых экранов на заданном листе. Используя это, вы можете собрать двунаправленную систему поиска словаря, чтобы сопоставить любой лист со всеми видовыми экранами, которые он размещает, и наоборот. Это должно помочь решить вашу задачу. Вот несколько примеров использования:

http://thebuildingcoder.typepad.com/blog/2014/04/determining-the-size-and-location-of-viewports-on-a-sheet.html

+0

Прошу прощения. Я не совсем понимаю, как это помогает мне узнать, что в настоящее время в uiview отображается активированный видовой экран. Можете ли вы объяснить дальше? –

+0

вы сказали, что у вас есть доступ к идентификатору вида активированного видового экрана. Я подумал, что было бы полезно использовать это в такой системе поиска. я думаю, я не совсем понимаю вашу проблему. –

+1

Предположим, у меня открывается вид на план этажа, а затем у меня также открыт лист с тем же планом на нем. Затем я активирую окно просмотра плана пола на открытом виде листа. Теперь у меня есть два UIViews, которые сообщают, что они являются одним и тем же планом. У меня нет возможности рассказать, что представляет собой план этажа и который является активированным окном просмотра того же плана этажа. Мне нужно знать, находится ли UIVIew в настоящее время в состоянии отображения активного видового экрана. Какой из них является активированным окном просмотра и какой из них является стандартным открытым видом? –